Ios 如何在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

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

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))对我不起作用。这是错误的,从视图中删除手势识别器不仅仅是释放它(就像您在代码中所做的那样)。您还必须从视图中分离识别器: