validateUserInterfaceItem(4)
前回の更に続き。
MTLControlItemEnablerとは何か?
MTLControlItemEnablerはコードを簡潔に表記する事を目的に書かれました。 UIの挙動を宣言的に表記出来ます。
例えば、メソッド”xyzAction:”を呼出すボタンのenable/disableを制御するには、”canXyzAction:”を定義します。
“canXyzAction:”の返り値でenable/disableを制御します。
- (IBAction) xyzAction:(id)sender
{
// 色々と実行
}
- (BOOL) canXyzAction:(NSObject<NSValidatedUserInterfaceItem>*)anItem
{
return YES or NO;
}
“canXyzAction:”の呼び出しは、”validateUserInterfaceItem:”で”controlItemEnabler:”を呼出すと内部で適当に呼出します。
- (BOOL)validateUserInterfaceItem:(NSObject<NSValidatedUserInterfaceItem>*)anItem
{
return [self controlItemEnabler:anItem];
}
MTLControlItemEnablerを拡張する
さらに今回のコードでは、もう一歩進めて以下のUIの挙動を変更出来ます。
- state
NSMixedState, NSOffState, NSOnState等の値でチェックBOXやラジオボタンのON/OFFやメニューのチェック等を制御します。
- image
buttunやToolboxItemやMenuItemの画像を制御します。例えば、音楽プレーヤーアプリのPlay/Stopを一つのボタンので行い画像を随時入れ替える場合等に使えます。
- title
ButtonやMenuItemのタイトル文字列を変更出来ます。
- label
toolbarItemは何故かtitle属性がなくlabel属性になっていたので追加。
メソッド”xyzAction:”が有った場合は、以下のようにメソッド名にprefixを付けたメソッドを作成します。
- (IBAction) xyzAction:(id)sender
{
// 色々と実行
}
- (BOOL) canXyzAction:(NSObject<NSValidatedUserInterfaceItem>*)anItem
{
return YES or NO;
}
- (NSIntger) stateOfXyzAction:(NSObject<NSValidatedUserInterfaceItem>*)anItem
{
return NSMixedState;//NSMixedState or NSOffState or NSOnState;
}
- (NSImage*) imageOfXyzAction:(id)anItem
{
if( func() )
return [NSImage imageNamed:NSImageNameIconViewTemplate];
else
return [NSImage imageNamed:NSImageNameListViewTemplate];
}
- (NSString*) titleOfXyzAction:(NSObject<NSValidatedUserInterfaceItem>*)anItem
{
return [NSString stringWithFormat:@"xyz(%li)", 1/*適当な数字とか*/];
}
サンプルコード
プロジェクトファイルはここ、
最初は以下のようになってます。
action1のボタン(titleOfで置換えているので、enable(x)となってるが)を押すと、titleやimageが変わります。
action2のボタンを押すと、また変わります。
action3を押すともとに戻ります。
コードの解説は特に無し。zipを解凍してみてみてください。