在Swift中以编程方式为子视图添加UIGestureRecognizer

12

我目前有一个子视图,在 ViewDidLoad() 中创建并添加到 UIView 中。 我正在尝试使用 UIGestureRecognizers 来检测轻击并取消隐藏特定的按钮。 我目前的代码:

 override func viewDidLoad() {
    super.viewDidLoad()
    architectView = CustomClass(frame: self.view.bounds)
    self.view.addSubview(architectView)        
    let gestureRecognizer = UITapGestureRecognizer(target: self, action: "handleTap:")
    gestureRecognizer.delegate = self
    architectView.addGestureRecognizer(gestureRecognizer)
}

func handleTap(gestureRecognizer: UIGestureRecognizer) {
    let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil))
    self.presentViewController(alert, animated: true, completion: nil)
}

handleTap()函数是一个简单的测试,用于检测是否识别了轻点。当按下时,此代码不会触发UIAlert。我错过了什么?


是的,我已经编辑过了,使其更加清晰明了。 - Andrew Walz
你尝试在 handleTap: 中设置断点,看看函数是否被调用了吗? - John Riselvato
是的,我刚刚尝试了。该函数没有被调用。 - Andrew Walz
我刚刚进行了测试。我为主UIView创建了一个插座,并将UIGestureRecognizer添加到该视图中。但是,函数handleTap()没有被调用。 - Andrew Walz
2个回答

13
我在这里测试了你的代码,它是可以工作的。但是,我认为你可能忘记了将UIGestureRecognizerDelegate协议添加到你的视图控制器中。参见下面:
class ViewController: UIViewController, UIGestureRecognizerDelegate {

    var architectView = UIView()

    override func viewDidLoad() {
        super.viewDidLoad()
        architectView = UIView(frame: self.view.bounds)
        self.view.addSubview(architectView)
        let gestureRecognizer = UITapGestureRecognizer(target: self, action: "handleTap:")
        gestureRecognizer.delegate = self
        architectView.addGestureRecognizer(gestureRecognizer)
    }

    func handleTap(gestureRecognizer: UIGestureRecognizer) {
        let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil))
        self.presentViewController(alert, animated: true, completion: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

10

基于Raphael Silva的回答,使用Swift 3版本代码:

import UIKit

class ViewController: UIViewController, UIGestureRecognizerDelegate {

    var architectView = UIView()

    override func viewDidLoad() {
        super.viewDidLoad()
        architectView = UIView(frame: self.view.bounds)
        self.view.addSubview(architectView)
        let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.handleTap(gestureRecognizer:)))
        gestureRecognizer.delegate = self
        architectView.addGestureRecognizer(gestureRecognizer)
    }

    func handleTap(gestureRecognizer: UIGestureRecognizer) {
        let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil))
        self.present(alert, animated: true, completion: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

哦,我的天啊。谢谢你,我已经四处寻找唯一的现代答案了。为什么苹果要废弃这么多东西呢?他们大部分的废弃似乎完全没有必要,只会引起混乱。 - Ben Akin
5
我认为这里不需要使用UIGestureRecognizerDelegate。 - brainray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接