当前位置: 首页 > 面试题库 >

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

栾耀
2023-03-14
问题内容

我编写了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'

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

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

我看到UIView的gestureRecognizers方法[AnyObject]??return,并且我认为双重包装的返回值使我感到震惊。谁能帮我?

更新:修改后的编译代码为:

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

问题答案:

iOS 11更新

通常,通过循环遍历视图数组来删除视图中的 所有 手势识别是(而且一直是)一个坏主意gestureRecognizers。您应该只删除手势识别是
添加到视图,通过跟踪那些识别器在自己的实例变量。

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

更新

您不再需要强制转换为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)
    }
}

或者我们可以将它们全部包装成一个表达式(为清楚起见而包装):

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

使用.lazy可以防止它创建不必要的临时数组。

原版的

这是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,如果返回,则会出现运行时错误,然后您将其强制拆开。



 类似资料:
  • 本文向大家介绍AndroidStudio:手势识别,包括了AndroidStudio:手势识别的使用技巧和注意事项,需要的朋友参考一下 一内容:设计一个手写字体识别程序。 二实现 ①建立一个存放手写字体的数据库 ②activity_main.xml 3.MainActivity.java 三效果 以上所述是小编给大家介绍的AndroidStudio手势识别详解整合,希望对大家有所帮助,如果大家有任

  • 本文向大家介绍在Swift程序中实现手势识别的方法,包括了在Swift程序中实现手势识别的方法的使用技巧和注意事项,需要的朋友参考一下 在这次IOS应用开发教程中,我们打算实现手势识别。正如你所知道的,IOS支持大量的手势操作,它们能提供了很好的应用控制和出色用户体验。 让我们开始吧! 首先需要在Xcode中创建一个新的Single View Application: 然后点击Next,弹出的窗口

  • 本文向大家介绍iOS UIPan手势识别器,包括了iOS UIPan手势识别器的使用技巧和注意事项,需要的朋友参考一下 示例 平移手势识别器可检测到拖动手势。以下示例将图像添加到视图控制器,并允许用户在屏幕上四处拖动图像。 目标C 迅速 注意:尽管UIPanGestureRecognizer对于检测任何拖动手势很有用,但是如果您只想检测基本手势(例如用户向左/向右或向上/向下拖动手指),请使用UI

  • 本文向大家介绍Android手势识别功能,包括了Android手势识别功能的使用技巧和注意事项,需要的朋友参考一下 现在智能手机基本都是触摸操作,点击按钮是一种交互方式,同时手势相关的操作,比如滑动等等同样是很重要的交互方式。这篇文章是对安卓手势交互相关知识点的整理和总结,主要来源基于官方文档。 触摸交互中的概念 常用事件 首先要了解一些常用的事件: ACTION_DOWN:第一个手指按下 ACT

  • 问题内容: 我正在寻找一种简单的方法,可以一次从一个超级视图中删除所有子视图,而不是一个一个地删除它们。 我缺少什么? 更新 我的应用有一个main 。我必须添加其他不同的视图作为子视图,以便提供一种导航。 因此,当单击按钮“打开”特定页面时,我需要删除所有子视图并添加新的子视图。 更新2-可行的解决方案(OS X) 我猜苹果已经解决了。 现在,它比以往更容易了,只需致电: 问题答案: 编辑:(感

  • 我有一个UIView,它通过几个约束被放置在屏幕上。一些约束由superview拥有,另一些约束由其他祖先拥有(例如,可能是UIViewController的view属性)。 要澄清这些解决方案的问题,请考虑以下视图层次结构: 爷爷 父亲 我 儿子 女儿 现在假设我们创建了以下约束,并始终将它们附加到它们最近的共同祖先: null