我的应用程序有三个视图,显示在同一个窗口中。
当用户进入视图1时,我想要启用主菜单的某些项目,当进入查看2个其他项目时,当进入视图3时,我希望禁用所有项目。
我该怎么做?
答案 0 :(得分:3)
阅读非正式协议NSMenuValidation
的文档:它说:此非正式协议允许您的应用程序更新NSMenuItem
对象的启用或禁用状态。它只声明了一个方法validateMenuItem
:因此,在MenuItem的目标对象中,您必须实现:
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
{
// what is the item?
NSLog( @"validate %@", [menuItem title] ); // useful for testing
// return something like this:
if( [ [menuItem title] isEqualToString:@"Show something"] ){
return ! [view3 userIsHere];
}
return YES;
}
在此方法的文档中,您可以找到另一个示例。
答案 1 :(得分:0)
似乎从 macOS 10.14+ 开始,NSMenuItemValidation> 已成为正式协议。在 Apple Developer https://developer.apple.com/documentation/appkit/nsmenuitemvalidation/3005191-validatemenuitem?language=objc 上,文档指出可选实例方法 validateMenuItem 已被 macOS 10.0-11.0 弃用(作为非正式协议的一部分)。
但是,根据 https://developer.apple.com/documentation/objectivec/nsobject/1518160-validatemenuitem,该方法现在要求实施,因为自 macOS 10.14+ 起已成为正式协议。
这意味着您必须遵守其中一种受支持类中的协议,例如 NSApplication、NSDocument[Controller] 或NSWindow 如所列。例如,向前这样的标题应该包含:
//Public interface
@interface MyDocument : NSDocument<NSMenuItemValidation>
@end
假设 Objective-C,macOS 上的通用实现可以采用 <NSUserInterfaceValidations、NSValidatedUserInterfaceItem 并实现相应的替代方法,例如:
- (BOOL)validateUserInterfaceItem:(NSMenuItem *)item {
NSLog(@"MenuController validateUserInterfaceItem: title=%@ [%@]", [item title], item.keyEquivalent);
if ([item action] == @selector(closeFile:)) {//Only match actions that need disabling
if (!isFileOpen) {//If app state is already file closed
return NO;//Disable this specific menu item "Close"
}
}
return YES;//Defaults to user interface item enabled
};
有关启用菜单项的更多信息,请参见Application Menu and Pop-up List Programming Topics。