我看到有很多这些问题,我想我遵循接受的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
,但这些都没有效果。
答案 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)
让您了解水龙头识别器的工作原理。
首先将点击手势识别器添加到视图控制器。您必须将对象放在此处,如图所示。
然后控制+拖动手势对象到您的视图并选择委托。
然后控制+将识别器拖到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)
}