【发布时间】:2018-03-20 15:57:02
【问题描述】:
我有一个课程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 是不是错了?我希望在找到匹配项之前查询响应者链,而不是声称我没有实现我明确执行的方法的异常!
【问题讨论】:
-
我只是好奇,当你在被覆盖函数的开头和被覆盖函数的结尾使用
super.validateMenuItem(:)时会有变化吗? -
不,底层状态不会改变。
标签: swift macos exception super nsmenuitem