如何在Swift中从UIView中删除所有手势识别器

我编写了Swift代码,试图从给定自定义UIView类型的所有子视图中删除所有手势识别器

让mySubviews=self.subviews.filter(){
$0.isKindOfClass(自定义子视图)
}
对于mySubviews中的子视图{
用于子视图中的识别器。手势识别器{
子视图.RemovegestureRecognitor(识别器)
}
}

但是识别器的行产生编译器错误:

“[AnyObject]”没有名为“Generator”的成员

我已尝试在enumerate(subview.gestureRecograiners)中将识别器的循环更改为识别器的,但这会产生编译器错误:

键入“[AnyObject]?!”不符合协议“SequenceType”

我看到UIView的手势识别器方法返回[AnyObject]??,我认为双重包装的返回值让我大吃一惊。有人能帮我吗

更新:
修订后的汇编代码为:

如果let recognizers=subview.gesturecognizers{
用于识别器中的识别器{
子视图.removeGestureRecognizer(识别器作为UIGestureRecognizer)
}
}

iOS 11的更新

一般来说,通过手势识别器数组循环从视图中删除所有手势识别是一个坏主意(而且一直都是这样)。您应该只删除添加到视图中的手势识别器,方法是在自己的实例变量中跟踪这些识别器

这在iOS 11中对于涉及拖放的视图具有新的重要性,因为UIKit在这些视图中添加了自己的手势识别器来识别拖放

更新

您不再需要强制转换到UIGestureRecognizer,因为在iOS 9.0中,UIView.gestureRecognizers已更改为类型[UIGestureRecognizer]?

另外,通过使用nil合并运算符??,可以避免使用if语句

子视图中识别器的

。手势识别器??[] {
子视图.RemovegestureRecognitor(识别器)
}

但是,最短的方法是:

子视图.手势识别器?.forEach(子视图.removeGestureRecognizer)

我们还可以在for循环中过滤子视图,如下所示:

用于子视图中的子视图,其中子视图为CustomSubview{
对于子视图中的识别器。手势识别器???[]{
子视图.RemovegestureRecognitor(识别器)
}
}

或者,我们可以将其全部封装为一个表达式(为了清晰起见,将其封装):

subviews.lazy.filter{$0是CustomSubview}
.flatMap{$0.gestureRecognitors???[]}
.forEach{$0.view?.removeGestureRecognizer($0)}

使用.lazy可以防止它创建不必要的临时数组

原创的

这是斯威夫特令人讨厌的事情之一。for循环只能在Objective-C中工作,但在Swift中,必须显式展开可选数组:

如果let recognizers=subview.gesturecognizers{
用于识别器中的识别器{
子视图.removeGestureRecognizer(识别器为!UIGestureRecognizer)
}
}

您可以强制展开它(用于子视图中的识别器。GestureRecograiners!),但我不确定GestureRecograiners是否可以返回nil,如果它返回并强制展开,您将得到运行时错误

发表评论