ios - 在另一个 UIViewController 中处理 UITapGestureRecognizer

标签 ios swift uiviewcontroller

我试图在另一个 UIViewController 中处理手势,但程序崩溃了。我想在第二个 UIViewController 中调用 handleTap 函数。

这是我想做的,但它崩溃了(错误消息:无法识别的选择器发送到类):

class ViewController: UIViewController {

    override func viewDidLoad() { super.viewDidLoad()
        Second.showMenu(self)
    }

}

public class Second: UIViewController {

    static func showMenu(_ vc: ViewController) {

        let bgView = UIView(frame: vc.view.frame)
        vc.view.addSubview(bgView)

        let tap = UITapGestureRecognizer(target: self, action:#selector(self.handleTap(sender:)))
        bgView.isUserInteractionEnabled = true
        bgView.addGestureRecognizer(tap)

    }

    func handleTap(sender: UITapGestureRecognizer) {
        print("handleTap")
    }

}

这可行,但我希望能够处理第二个 UIViewController 中的所有内容:

class ViewController: UIViewController {

    override func viewDidLoad() { super.viewDidLoad()
        Second.showMenu(self)
    }

    func handleTap(sender: UITapGestureRecognizer) {
        print("handleTap")
    }

}

public class Second: UIViewController {

    static func showMenu(_ vc: ViewController) {

        let bgView = UIView(frame: vc.view.frame)
        vc.view.addSubview(bgView)

        let tap = UITapGestureRecognizer(target: vc, action:#selector(vc.handleTap(sender:)))
        bgView.isUserInteractionEnabled = true
        bgView.addGestureRecognizer(tap)

    }

}

最佳答案

这个函数:

static func showMenu(_ vc: ViewController) {}

是一个静态函数。这意味着它不是在 View Controller 的实例上执行,而是在类本身上执行。您添加了一个手势识别器:

let tap = UITapGestureRecognizer(target: self, action:#selector(self.handleTap(sender:)))

target:self 表示选择器在类上调用,但handleTap 函数不是静态的。一个简单的解决方法是将其设为静态函数:

static func handleTap(sender: UITapGestureRecognizer) {
    print("handleTap")
}

但我认为它仍然没有意义,即使它有效。我很难想象你需要执行一个选择器作为另一个 View Controller 中生成的事件的响应的情况。

关于ios - 在另一个 UIViewController 中处理 UITapGestureRecognizer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44400372/

相关文章:

c# - 如何对 Controller 中的 View 进行编程更改出现在 Storyboard 中

iphone - 如何垂直移动带有 slider 的 UILabel

ios - UITableview 标题栏带有星期日期?

ios - 以编程方式向上或向下滚动选择器 View

ios - 从模态视图 Controller 返回到 RootViewController

ios - 如何在 iOS Swift 中隐藏视频窗口并在结束后再次显示?

ios - 如何调试 iOS 扩展 (.appex)?

ios - 您可以同时使用 Storyboard和程序代码吗?

ios - Auth.auth.currentUser.uid 即使登录有效也无法正常工作

Swift - OSX - 调整 NSImage 数据大小