【发布时间】:2017-07-21 17:06:32
【问题描述】:
我希望父 ViewController 处理其子 ViewControllers 生成的 Target-Action。
根据 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 literal is not a valid Objective-C selector
button.addTarget(nil, action: Selector("buttonPressed(sender:)"), for: .touchDown)
【问题讨论】:
标签: swift uicontrol responder-chain