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

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'

我try 将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数组从视图中删除all个手势识别是个坏主意(而且一直都是).您应该只删除添加到视图中的手势识别器,方法是在自己的实例变量中跟踪这些识别器.

这在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)
    }
}

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

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

使用.lazy应该可以防止它创建不必要的临时array.

起初的

这是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,如果它返回nil,您将得到一个运行时错误,如果您强制展开它.

Swift相关问答推荐

多个提取来计算核心数据中的记录

减go 用SWIFT struct 填充的NSCountedSet

SwiftData:线程1:&Quot;NSFetchRequest找不到实体名称';提醒&q;的NSEntityDescription

阻塞(受CPU限制的)任务的异步功能?

如何将图像插入到矩形中

出错-无法将季节类型的值转换为预期的参数类型';[水果]';

如何在枚举有关联数据时使用combined if with case

如何避免切换视图递归onChange调用SwiftUI

UIView.convert(_ point:to:)的意外行为

避免 `(())` 显式指定 Void 类型的枚举关联值

如何从 RC 加载场景作为 ModelEntity 而不是普通实体?

如何在 SwiftUI 中创建条件内容?

如何在 UITableView 中点击图片和标题

如何使用 ISO 国家代码(2 个字母)查找区域设置标识符

签署GoogleSignIn-GoogleSignIn需要开发团队

RealityKit – 无法加载 ARView(发现为零)

临时添加到视图层次 struct 后,Weak view引用不会被释放

来自 ObservableObject 的绑定值

使用 JSONEncoder 对类型为 Codable 的变量进行编码

Switch 语句中的字符串:String不符合协议IntervalType