我希望父ViewController
能够处理其子ViewControllers
之一生成的目标操作。
根据Apple文档,这可以通过将target
设置为nil
并跟随响应者链来实现。
如果为目标对象指定nil,则控件将搜索 响应器链,用于定义指定操作的对象 方法。 https://developer.apple.com/documentation/uikit/uicontrol
但是如何在target
为nil
时编写操作方法签名?
通常,您将函数名称括在#selector()
中,它会为您提供编译时检查,表明该签名存在方法。像这样:
class MyViewController: UIViewController {
override func viewDidLoad() {
self.button.addTarget(self, action: #selector(buttonPressed(sender:)), for: .touchDown)
}
func buttonPressed(sender: UIButton) { }
}
但由于target
为nil
,编译器会抱怨,因为找不到它:
// ! 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)
答案 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)