index, AV, AppleScript, Bicycle, Cinema, DTM, Dairy, Dev, Fashion, Fitness, Game, Health, Help, Lyrics, Meal, Motor, Motorcycle, Music, Objective-C, PC, PDA, Phone, Robot, S15S, Stationary, Swift, Text, Travel, V36, Watch
コントローラレイヤーを利用して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を意識する必要がないので、かなり簡便だ。