ios - UITapGestureRecognizer 不工作 - Swift 3

标签 ios swift uitapgesturerecognizer

我看到有很多这样的问题,我想我正在遵循公认的 Swift 3 方法,但我仍然一无所获。我可以看到 UITapGestureRecognizer 已附加。这是我的代码:

let tileClick = UITapGestureRecognizer(target: self, action: #selector(GameManagement.initiateTileClick(_:)))
newView.addGestureRecognizer(tileClick)
newView.isUserInteractionEnabled = true

func initiateTileClick(_ sender: UITapGestureRecognizer) {
    print("initiate tile click")
}

一些注意事项:

1) 我附加手势识别器的 View 有两个 View 和一个标签,每个 View 覆盖整个 View 框架,但是,我尝试将识别器附加到标签,这是最上面的子项,它仍然不起作用。

2) 添加识别器的函数和点击时调用的函数都包含在一个 NSObject 文件中。我有各种相互关联的功能,我希望能够从多个 View Controller 调用这些功能,并且更愿意将其保存在单独的 NSObject 文件中。当我将所有内容都放在 UIViewController 文件中时,该过程有效;当我将函数移至 NSObject 文件时,该过程停止工作。

3) 我试过将 GameManagement.initiateTileClick 更改为 self.initiateTileClick 或只是 initiateTileClick 但这些都不起作用。

最佳答案

如果您将 View 放在 NSObject 子类中,那么这些 views 将失去它们对 UIResponder 的行为,它像我一样管理 UI 交互无法看到您如何将这些 View 添加到界面。

如您所说,它在 ViewController 内部工作,因为它管理 View 层次结构和响应者链。

解决方案是编写扩展来分离代码或更好的抽象。

extension YourViewController {

   newView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(GameManagement.initiateTileClick(_:))))
   newView.isUserInteractionEnabled = true

   func initiateTileClick(_ sender: UITapGestureRecognizer) {
      print("initiate tile click")
   }
}

关于ios - UITapGestureRecognizer 不工作 - Swift 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43837359/

相关文章:

ios - 在动画中点击 UIImage

ios - 如何同时将 UILongPressGestureRecognizer 和 UITapGestureRecognizer 添加到同一个控件?

ios - Swift 编译器警告我在覆盖 getter 时必须使用 self

ios - 使用 NSTimer 注销应用程序

ios - 更新到 Xcode 9 有错误

ios - swift 3 : Convert Dictionary of String type to Int

ios - Swift - 从一年中的某一天获取日期

ios - 如何在不同的 Storyboard 中对导航堆栈中的某些 View Controller 执行推送 segue?

swift - 某些设备上不需要的 ios 8 应用程序轮换

ios - 模仿 UITextView 的默认双击行为