如何从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()