gpt4 book ai didi

swift - 通过 super.validateMenuItem( :) generates Swift exception

转载 作者:搜寻专家 更新时间:2023-11-01 06:29:25 25 4
gpt4 key购买 nike

我有一个类,MyViewController,有几个从菜单项触发的 Action 。

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

如果我改为在方法结束时返回 false,则没有异常。

这发生在调用 validateMenuItem(:) 时,例如打开菜单时。尽管如此,该操作还是会在选择项目时触发。

我在方法结束时调用 super 是不是错了?我希望在找到匹配之前查询响应者链,而不是声称我没有实现我明确实现的方法的异常!

最佳答案

Am I wrong to be calling super at the end of the method

是的。 NSViewController 及其任何父类(super class)都没有实现 validateMenuItem。尽管 Swift 中有 override,但它实际上并没有被继承。它通过非正式协议(protocol) (NSMenuValidation) 注入(inject)到 Objective-C 中。 [Swift 编译器不理解那种诡计;因此 override 尽管我们没有覆盖任何东西。]

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

关于swift - 通过 super.validateMenuItem( :) generates Swift exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49388800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com