addTarget:action:forControlEvents:target为nil时的选择器语法?

时间:2017-07-21 17:06:33

标签: swift uicontrol responder-chain

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

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

  

如果为目标对象指定nil,则控件将搜索   响应器链,用于定义指定操作的对象   方法。 https://developer.apple.com/documentation/uikit/uicontrol

但是如何在targetnil时编写操作方法签名?

通常,您将函数名称括在#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初始化Selector,但编译器也抱怨。

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

2 个答案:

答案 0 :(得分:3)

解决方案是使用定义类的名称作为前缀。

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

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

答案 1 :(得分:0)

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