15

InterfaceBuilderで作成されたいくつかのアイテムを含むメニューがあります。そこでは問題ないように見え、「有効」がチェックされています。しかし、アプリケーションを実行すると、すべてのメニュー項目がグレー表示されます。

チェックisEnabledしましたが、trueを返します。

また、プログラムで(Interface Builderの有無にかかわらず)作成されたメニュー項目はinitWithTitle問題なく機能します。

ここで何かが足りませんか?私はOSXの開発にまったく慣れていません。

4

3 に答える 3

28

メニュー項目のターゲットを設定し、そのターゲットがメニュー項目のアクションメソッドを実装していることを確認することを忘れないでください。

menuItem.target = self;
  • メニュー項目のターゲットが設定されている場合、NSMenuは最初に、そのオブジェクトが項目のアクションメソッドを実装しているかどうかを確認します。そうでない場合、アイテムは無効になります。ターゲットがアイテムのアクションメソッドを実装している場合、NSMenuはまず、そのオブジェクトがvalidateMenuItem:またはvalidateUserInterfaceItem:メソッドを実装しているかどうかを確認します。そうでない場合は、メニュー項目が有効になります。含まれている場合、メニュー項目の有効なステータスは、メソッドの戻り値によって決定されます。

  • メニュー項目のターゲットが設定されておらず、NSMenuオブジェクトがコンテキストメニューでない場合、NSMenuはレスポンダーチェーンを使用してターゲットを決定します。アイテムのアクションを実装するオブジェクトがレスポンダーチェーンにない場合、アイテムは無効になります

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

于 2014-01-26T09:45:43.497 に答える
8

誰かがこれをググって利益を得るかもしれない場合に備えて、'Action'メソッドは:(id)senderパラメータなしで宣言されました:

-(IBAction) quit;

不思議なことに、setAction方法はNSMenuItemそれを食べて文句を言わなかった。しかたがない。

于 2011-02-02T17:37:45.477 に答える
3

ああ、使用の疫病NSMenu...

チェックアウト<NSMenuValidation>

通常、実装は次のように簡単になります。

- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
  return [menuItem isEnabled];
}
于 2011-02-02T03:49:18.173 に答える