下降到 super.validateMenuItem(:) 会产生 Swift 异常
Falling through to super.validateMenuItem(:) generates Swift exception
我有一个 class、MyViewController
,有几个由菜单项触发的操作。
class MyViewController: NSViewController { … }
这些操作与 IB 中的第一响应者相关联。操作如下所示:
@IBAction func removeSelectedItems(_ sender: AnyObject) {
arrayController.remove(contentsOf: arrayController.selectedObjects)
}
validateMenuItem(:)
代码如下所示:
override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
let selection = arrayController.selectedObjects
if (menuItem.action == #selector(removeSelectedItems(_:))) {
return selection!.count > 0
}
return super.validateMenuItem(menuItem)
}
当我在 if()
列表中包含操作时,一切都很好。但如果我不这样做,并且 validateMenuItem(:)
掉到 super,我会得到一个例外:
[MyApp.MyViewController validateMenuItem:]: unrecognized selector sent to instance 0x618000165ac0
如果我在方法的末尾改为 return false
,也不例外。
调用 validateMenuItem(:)
时会发生这种情况,例如打开菜单时。但是,尽管如此,选择该项目时仍会触发动作。
我在方法结束时调用 super
是不是错了?我希望在找到匹配之前查询响应者链,而不是声称我没有实现我明确实现的方法的异常!
Am I wrong to be calling super at the end of the method
是的。 NSViewController 及其任何超类都没有实现 validateMenuItem
。尽管Swift中有override
,但实际上并没有被继承。它通过非正式协议 (NSMenuValidation) 注入 Objective-C。 [Swift 编译器不理解那种诡计;因此 override
尽管我们没有覆盖任何东西。]
我有一个 class、MyViewController
,有几个由菜单项触发的操作。
class MyViewController: NSViewController { … }
这些操作与 IB 中的第一响应者相关联。操作如下所示:
@IBAction func removeSelectedItems(_ sender: AnyObject) {
arrayController.remove(contentsOf: arrayController.selectedObjects)
}
validateMenuItem(:)
代码如下所示:
override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
let selection = arrayController.selectedObjects
if (menuItem.action == #selector(removeSelectedItems(_:))) {
return selection!.count > 0
}
return super.validateMenuItem(menuItem)
}
当我在 if()
列表中包含操作时,一切都很好。但如果我不这样做,并且 validateMenuItem(:)
掉到 super,我会得到一个例外:
[MyApp.MyViewController validateMenuItem:]: unrecognized selector sent to instance 0x618000165ac0
如果我在方法的末尾改为 return false
,也不例外。
调用 validateMenuItem(:)
时会发生这种情况,例如打开菜单时。但是,尽管如此,选择该项目时仍会触发动作。
我在方法结束时调用 super
是不是错了?我希望在找到匹配之前查询响应者链,而不是声称我没有实现我明确实现的方法的异常!
Am I wrong to be calling super at the end of the method
是的。 NSViewController 及其任何超类都没有实现 validateMenuItem
。尽管Swift中有override
,但实际上并没有被继承。它通过非正式协议 (NSMenuValidation) 注入 Objective-C。 [Swift 编译器不理解那种诡计;因此 override
尽管我们没有覆盖任何东西。]