addTarget:action:forControlEvents:目标为零时的选择器语法?

addTarget:action:forControlEvents: selector syntax when target is nil?

我希望父 ViewController 处理其子 ViewControllers 之一生成的目标操作。

根据 Apple 文档,这应该可以通过将 target 设置为 nil 并遵循响应链来实现。

If you specify nil for the target object, the control searches the responder chain for an object that defines the specified action method. https://developer.apple.com/documentation/uikit/uicontrol

但是targetnil时,action方法签名怎么写呢?

通常,您将函数名称括在 #selector() 中,这使您可以在编译时检查是否存在具有该签名的方法。像这样:

class MyViewController: UIViewController {
    override func viewDidLoad() {
         self.button.addTarget(self, action: #selector(buttonPressed(sender:)), for: .touchDown)
    }

    func buttonPressed(sender: UIButton) { }

}

但是因为 targetnil 编译器抱怨因为找不到它:

// ! Use of unresolved identifier "buttonPressed(sender:)"
button.addTarget(nil, action: #selector(buttonPressed(sender:)), for: .touchDown)

我尝试使用字符串初始化选择器,但编译器也报错。

    // ! String literal is not a valid Objective-C selector
    button.addTarget(nil, action: Selector("buttonPressed(sender:)"), for: .touchDown)

解决方案是在定义 class 的名称前加上前缀。

    button.addTarget(nil, action: #selector(MyViewController.buttonPressed(sender:)), for: .touchDown)

仅供参考,我通过 this nice blog post from Jan 2016、下载源文件并让 XCode 将其转换为 Swift 3 语法得到了答案:-)

这对我有用,请注意双括号以避免警告: NSApp.sendAction(Selector(("enterActivationNumber:")), to: nil, from: sender)