2011年4月30日土曜日

NSToolbar にカテゴリィを用いてメソッドを追加する

 Safari で言えば「戻る・進む」ボタンや URL 欄がある部分を Cocoa アプリケーションでは「ツールバー」と言い、NSToolbar クラスで表現される。ツールバー上にある要素は NSToolbarItem クラスで表現され、NSToolbar のインスタンスメソッド - (NSArray *)items で配列オブジェクトとして取得できる。画面最上部のメニューバーとメニュー項目は、同じように NSMenu クラス、NSMenuItem クラスで表現され、NSMenu からインスタンスメソッド - (NSArray *)itemArray で配列オブジェクトととして NSMenuItem を取得できる。

 ここで、NSMenu にはインスタンスメソッド - (NSMenuItem *)itemWithTag:(NSInteger)aTag が存在し、NSMenuItem に設定した tag をパラメータに指定することで特定のメニュー項目を一発で取得できるのに対し、NSToolbar にはそのようなインスタンスメソッドが存在しない。

 今回は NSToolbar に NSMenu と同様の - (NSToolbarItem *)itemWithTag:(NSInteger)aTag を実装する。実装するにあたり、NSToolbar のサブクラスを作るのではなく、カテゴリィを用いてメソッドを追加する形で行う。

 まずヘッダファイル NSToolbar+Additions.h が以下のようになる。
#import <Cocoa/Cocoa.h>

@interface NSToolbar (Additions)

- (NSToolbarItem *)itemWithTag:(NSInteger)aTag;

@end
 実装ファイル NSToolbar+Additions.m は以下のようになる。
#import "NSToolbar+Additions.h"

@implementation NSToolbar (Additions)

- (NSToolbarItem *)itemWithTag:(NSInteger)aTag
{
  NSArray *items = [self items];
  for(NSToolbarItem *item in items) {
    if([item tag] == aTag) return item;
  }
  return nil;
}

@end
 簡単ですね。これで、NSToolbar+Additions.h をインポートすれば、NSToolbar のインスタンスメソッドとして - (NSToolbarItem *)itemWithTag:(NSInteger)aTag を使えるようになる。

0 comments:

コメントを投稿