下降到 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 尽管我们没有覆盖任何东西。]

https://forums.developer.apple.com/thread/46772