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

我写了试图从给定的自定义UIViewtypes的所有子视图中删除所有手势识别器的Swift代码。

let mySubviews = self.subviews.filter() { $0.isKindOfClass(CustomSubview) } for subview in mySubviews { for recognizer in subview.gestureRecognizers { subview.removeGestureRecognizer(recognizer) } } 

但是for recognizer器行会产生编译器错误:

 '[AnyObject]?' does not have a member named 'Generator' 

我已经尝试更改for recognizer循环以for recognizer in enumerate(subview.gestureRecognizers)器,但会产生编译器错误:

 Type '[AnyObject]?!' Does not conform to protocol 'SequenceType' 

我看到UIView的gestureRecognizers方法返回[AnyObject]?? ,而且我认为双重包装的回报价值正在让我失望。 谁能帮我?

更新:修改,编译代码是:

 if let recognizers = subview.gestureRecognizers { for recognizer in recognizers! { subview.removeGestureRecognizer(recognizer as UIGestureRecognizer) } } 

更新为iOS 11

通常,通过循环通过其gestureRecognizers数组来移除所有从视图中识别的手势是一个坏主意。 您只应通过在自己的实例variables中跟踪这些识别器来移除添加到视图中的手势识别器。

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

UPDATE

您不再需要转换到UIGestureRecognizer ,因为UIView.gestureRecognizers已更改为键入[UIGestureRecognizer]? 在iOS 9.0中。

另外,通过使用nil-coalescing运算符 ,你可以避免if语句。

 for recognizer in subview.gestureRecognizers ?? [] { subview.removeGestureRecognizer(recognizer) } 

但是,最简单的方法是这样的:

 subview.gestureRecognizers?.forEach(subview.removeGestureRecognizer) 

我们也可以像这样在for循环中对子视图进行过滤:

 for subview in subviews where subview is CustomSubview { for recognizer in subview.gestureRecognizers ?? [] { subview.removeGestureRecognizer(recognizer) } } 

或者我们可以将它们全部包装成一个expression式(为了清晰起见):

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

.lazy的使用应该防止它创build不必要的临时数组。

原版的

这是关于Swift的那些恼人的事情之一。 您的for循环只能在Objective-C中工作,但在Swift中,您必须显式解开可选数组:

 if let recognizers = subview.gestureRecognizers { for recognizer in recognizers { subview.removeGestureRecognizer(recognizer as! UIGestureRecognizer) } } 

你可以强制解开它( for recognizer in subview.gestureRecognizers! ),但我不知道是否gestureRecognizers是否可以返回nil ,你会得到一个运行时错误,如果它并强制解开它。

更简单的方法是

 for subview in self.subviews as [UIView] { if subview.isKindOfClass(CustomSubview) { subview.gestureRecognizers?.removeAll(keepCapacity: false) } } 

最简单的解决scheme

 yourView.gestureRecognizers?.removeAll()