在上下文菜单中,如何为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];
}
}
如何给项目打勾?
答案 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