如何向NSMenuItem添加复选标记

时间:2010-02-01 12:42:24

标签: cocoa menu

在上下文菜单中,如何为NSMenuItem提供复选标记?我想把它放在特定的项目旁边。我在mouseDown:函数中创建了菜单,如下所示:

-(void)mouseDown:(NSEvent *)event
{
NSPoint pointInView = [self convertPoint:[event locationInWindow] fromView:nil];

if (NSPointInRect(pointInView, [self shapeRect]) )
{       
    NSMenu *theMenu = [[[NSMenu alloc] initWithTitle:@"default Contextual Menu"] autorelease];

    [theMenu insertItemWithTitle:@"Circle" action:@selector(circle:) keyEquivalent:@"" atIndex:0];
    [theMenu insertItemWithTitle:@"Rectangle" action:@selector(rectangle:) keyEquivalent:@"" atIndex:1];

    [NSMenu popUpContextMenu:theMenu withEvent:event forView:self];        
}   
}

如何给项目打勾?

5 个答案:

答案 0 :(得分:16)

查看NSUserInterfaceItemValidations协议。显示菜单时,它将使用validateUserInterfaceItem:方法查询响应者链中的每个响应者,以确定是否应启用该项。 (只要链中的一个响应者返回YES,就会启用一个项目。这也为您提供了自定义项目的机会。例如:

- (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item {
    if ([item action] == @selector(actionMethodForItemThatShouldBeChecked:)] {
        // This method is also used for toolbar items, so it's a good idea to 
        // make sure you're validating a menu item here
        if ([item respondsToSelector:@selector(setState:)])
            [item setState:NSOnState];
    }
    return YES;
}

答案 1 :(得分:7)

你想要这样的东西:

// Place a check mark next to "Circle"
NSMenuItem * theItem = [theMenu indexOfItemWithTitle: @"Circle"];
[item setState: NSOnState];

您可以使用NSOffState删除复选标记。

答案 2 :(得分:3)

使用NSMenuValidation协议,您可以执行此操作:

-(BOOL)validateMenuItem:(NSMenuItem *)menuItem
{
    if(menuItem.action==@selector(actionMethodForItemThatShouldBeChecked:))
    {
        menuItem.state=NSOnState;
    }

    return YES;
}

答案 3 :(得分:1)

在Swift中,您可以像这样检查NSMenuItem

let myItem: NSMenuItem = ...
myItem.state = .on

有关更多信息,请检查https://developer.apple.com/documentation/appkit/nscontrol/statevalue

答案 4 :(得分:0)

我相信 NSOnState 已弃用(在macOS 10.14中首次弃用),您可以改用NSControlStateValueOn。例如:

[myItem setState: NSControlStateValueOn];

有关更多信息,请检查here