UITapGestureRecognizer无法正常工作 - Swift 3

时间:2017-05-07 22:26:25

标签: 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)我附加手势识别器的视图有两个视图和一个标签,每个视图覆盖整个视图框架,但是,我尝试将识别器附加到标签上,这是最顶级的子项目,它仍然无法正常工作。

2)添加识别器的功能和在tap上调用的功能都包含在NSObject文件中。我有各种互连的功能,我希望能够从多个视图控制器调用,并希望将其保存在单独的NSObject文件中。当我将所有内容放在UIViewController文件中并在将函数移动到NSObject文件时停止工作时,该过程有效。

3)我已尝试将GameManagement.initiateTileClick更改为self.initiateTileClick或仅initiateTileClick,但这些都没有效果。

2 个答案:

答案 0 :(得分:3)

如果您将自己的观点放在NSObject子类中,那么这些views将失去管理用户界面互动的UIResponder的行为,因为我无法看到您如何添加这些视图到界面。

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

解决方案是将extensions写入单独的代码或更好的抽象。

extension YourViewController {

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

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

答案 1 :(得分:1)

让您了解水龙头识别器的工作原理。

首先将点击手势识别器添加到视图控制器。您必须将对象放在此处,如图所示。

Drop your tap gesture object here

然后控制+拖动手势对象到您的视图并选择委托。

然后控制+将识别器拖到swift文件中,操作就像这样。

@IBAction func tapGesture(_ sender: UITapGestureRecognizer) {

}

现在你必须看到当你给文本字段输入一些内容时,会出现键盘。但是如果你在文本字段之外按下,那就是视图中的任何位置,键盘会隐藏。这是因为点击手势识别器。

考虑您有一个文本字段,如果您单击该文本字段,则会出现键盘。但是当你在文本区域外点击时,键盘必须隐藏。

添加此代理

UITextFieldDelegate

实施这个:

@IBOutlet var phoneText: UITextField!

override func viewDidLoad() {

    super.viewDidLoad()

    // Do any additional setup after loading the view.

    exampleText.delegate = self
}

@IBAction func tapGesture(_ sender: UITapGestureRecognizer) {

    exampleText.endEditing(true)
}