Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

menu item is enabled, but still grayed out

I have a menu with several items created in interface builder. It looks fine there and 'enabled' is checked. But when I run the application, all menu items are grayed out.

I've checked isEnabled, it returns true.

Also, menu items created programmatically (with initWithTitle and without interface builder) work just fine.

Am I missing something here? I'm really quite new to OS X development.

like image 395
Nikita Rybak Avatar asked Feb 02 '11 02:02

Nikita Rybak


3 Answers

Remember to set your menu item's target and ensure that said target implements the menu item's action method.

menuItem.target = self;
  • If the menu item’s target is set, then NSMenu first checks to see if that object implements the item’s action method. If it does not, then the item is disabled. If the target does implement the item’s action method, NSMenu first checks to see if that object implements validateMenuItem: or validateUserInterfaceItem: method. If it does not, then the menu item is enabled. If it does, then the enabled status of the menu item is determined by the return value of the method.

  • If the menu item’s target is not set and the NSMenu object is not a contextual menu, then NSMenu uses the responder chain to determine the target. If there is no object in the responder chain that implements the item’s action, the item is disabled.

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MenuList/Articles/EnablingMenuItems.html

like image 60
pkamb Avatar answered Oct 03 '22 04:10

pkamb


In case somebody might google this out and benefit, 'Action' method was declared without :(id)sender parameter:

-(IBAction) quit;

Strangely, setAction method in NSMenuItem ate it and didn't complain. Oh well.

like image 31
Nikita Rybak Avatar answered Oct 03 '22 02:10

Nikita Rybak


Ah, the plague of using NSMenu...

Check out <NSMenuValidation>.

Usually the implementation will be as simple as:

- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
  return [menuItem isEnabled];
}
like image 37
Dave DeLong Avatar answered Oct 03 '22 02:10

Dave DeLong