ルーム情報 : "droom" (290件)
最近更新されたメモ一覧 :
docs
被リンクメモ一覧 : (1件)
[Tips]
[Home] [List] [Recent] [Orphan] [Help] [Edit] [Remove]

Objective-C : NSMenu & MenuItem

メニューのenableを切りかえる方法

コントローラレイヤーを利用してNSMenuItemのenableをbindingしても、enableをNOにできない。これは、NSMenuItemに指定されてるセレクタに対応するセレクタがResponderChainに存在するからだ。

この問題を避けるための方法のひとつは、[NSApp mainMenu]からFirstResponderに送信されるvalidateMenuItem:をフックしてメニューのenableを変更すること。ただし、これには受け手側でMenuItemを逆探知する必要があり面倒だ。

もしセレクタの種類が分かっているなら、セレクタへの応答をResponderChainの途中で制限すれば、自動的にメニュー項目はdisableになる。セレクタへの応答はrespondsToSelector:で設定する。

// MyDocument.m
- (BOOL)respondsToSelector:(SEL)aSelector
{
  if (aSelector == @selector(saveDocument:) 
      && ![self isDocumentEdited]){
    return NO;
  }
  return [super respondsToSelector:aSelector];
}

Responder側でメニュー項目のタイトルやTagを意識する必要がないので、かなり簡便だ。

[Home] [List] [Recent] [Orphan] [Help] [Edit] [Remove]
-->