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/*適当な数字とか*/];
}

サンプルコード

プロジェクトファイルはここ、

EnablerTest-3.zip

最初は以下のようになってます。

../../../_images/ss011.tiff

action1のボタン(titleOfで置換えているので、enable(x)となってるが)を押すと、titleやimageが変わります。

../../../_images/ss021.tiff

action2のボタンを押すと、また変わります。

../../../_images/ss031.tiff

action3を押すともとに戻ります。

コードの解説は特に無し。zipを解凍してみてみてください。