如何从NSMenu中禁用某些视图的项目?

时间:2014-10-24 23:26:51

标签: objective-c xcode macos

我的应用程序有三个视图,显示在同一个窗口中。

当用户进入视图1时,我想要启用主菜单的某些项目,当进入查看2个其他项目时,当进入视图3时,我希望禁用所有项目。

我该怎么做?

2 个答案:

答案 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+ 起已成为正式协议。

这意味着您必须遵守其中一种受支持类中的协议,例如 NSApplicationNSDocument[Controller] 或NSWindow 如所列。例如,向前这样的标题应该包含:

//Public interface
@interface MyDocument : NSDocument<NSMenuItemValidation>

@end

假设 Objective-C,macOS 上的通用实现可以采用 <NSUserInterfaceValidationsNSValidatedUserInterfaceItem 并实现相应的替代方法,例如:

- (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