Ios 如何在Swift中从UIView中删除所有手势识别器
我编写了Swift代码,试图从给定自定义UIView类型的所有子视图中删除所有手势识别器Ios 如何在Swift中从UIView中删除所有手势识别器,ios,uiview,swift,uigesturerecognizer,optional,Ios,Uiview,Swift,Uigesturerecognizer,Optional,我编写了Swift代码,试图从给定自定义UIView类型的所有子视图中删除所有手势识别器 let mySubviews = self.subviews.filter() { $0.isKindOfClass(CustomSubview) } for subview in mySubviews { for recognizer in subview.gestureRecognizers { subview.removeGestureRecognizer(recognizer
let mySubviews = self.subviews.filter() {
$0.isKindOfClass(CustomSubview)
}
for subview in mySubviews {
for recognizer in subview.gestureRecognizers {
subview.removeGestureRecognizer(recognizer)
}
}
但是识别器的行产生编译器错误:
'[AnyObject]?' does not have a member named 'Generator'
Type '[AnyObject]?!' Does not conform to protocol 'SequenceType'
我已尝试在enumerate(subview.gestureRecograiners)
中将识别器的循环更改为识别器的,但这会产生编译器错误:
'[AnyObject]?' does not have a member named 'Generator'
Type '[AnyObject]?!' Does not conform to protocol 'SequenceType'
我看到UIView的手势识别器
方法返回[AnyObject]??
,我认为双重包装的返回值让我大吃一惊。有人能帮我吗
更新:
修订后的汇编代码为:
if let recognizers = subview.gestureRecognizers {
for recognizer in recognizers! {
subview.removeGestureRecognizer(recognizer as UIGestureRecognizer)
}
}
iOS 11的更新
一般来说,通过手势识别器
数组循环从视图中删除所有手势识别是一个坏主意(而且一直都是这样)。您应该只删除添加到视图中的手势识别器,方法是在自己的实例变量中跟踪这些识别器
这在iOS 11中对于涉及拖放的视图具有新的重要性,因为UIKit在这些视图中添加了自己的手势识别器来识别拖放
更新
您不再需要强制转换到UIGestureRecognizer
,因为在iOS 9.0中,UIView.gestureRecognizers
已更改为类型[UIGestureRecognizer]?
另外,通过使用nil合并运算符??,可以避免使用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)
}
}
或者,我们可以将其全部封装为一个表达式(为了清晰起见,将其封装):
使用.lazy
可以防止它创建不必要的临时数组
起初的
这是斯威夫特令人讨厌的事情之一。for循环只能在Objective-C中工作,但在Swift中,必须显式展开可选数组:
if let recognizers = subview.gestureRecognizers {
for recognizer in recognizers {
subview.removeGestureRecognizer(recognizer as! UIGestureRecognizer)
}
}
您可以强制展开它(用于子视图中的识别器。gestureRecognizers!
),但我不确定gestureRecognizers
是否可以返回nil
,如果返回,您将得到运行时错误并强制展开它。更简单的方法是
for subview in self.subviews as [UIView] {
if subview.isKindOfClass(CustomSubview) {
subview.gestureRecognizers?.removeAll(keepCapacity: false)
}
}
最简解
yourView.gestureRecognizers?.removeAll()
非常感谢。在你的帮助下,我现在已经把它编译好了!我必须对代码进行2次更改以使其编译:1)for循环需要recognizers
强制展开,2)必须将recognizer
参数强制转换为uigesturecognizer,因为UIView的gesturecognizers方法返回AnyObject数组。我将编辑我的问题以包含最后的代码。您还需要强制转换它:子视图。removeGestureRecognizer(手势为UIGestureRecognizer)
强制转换在iOS 9.0中已过时。您也可以只调用gestureRecognizers?.removeAll()
或view.gestureRecognizers=[]
。这是最好的解决方案。删除单个手势(例如:cell?.RemovegestureRecognitizer(swipeLeft))对我不起作用。这是错误的,从视图中删除手势识别器不仅仅是释放它(就像您在代码中所做的那样)。您还必须从视图中分离识别器: