タイトル鶴薗賢吾のCocoaはやっぱり!出張版》#6 - ツールバー(3)カテゴリーユーザインタフェース, Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版
作成日2001/12/17 22:57:54作成者新居雅行
 ̄ ̄ ̄アイテムリスト取得メソッドのちょっとした改造___

説明ばかりでは面白くありませんので、ここで、ちょっとソースを改造してみましょう。2つのメソッドに以下の改造を加えます。

◇Controller.m → toolbarAllowedItemIdentifiers

- (NSArray *) toolbarAllowedItemIdentifiers : (NSToolbar*) toolbar {

NSLog( @"toolbarAllowedItemIdentifiers" ); // 追加

return [ NSArray arrayWithObjects :
: 以下の3行を追加
NSToolbarShowColorsItemIdentifier,
NSToolbarShowFontsItemIdentifier,
NSToolbarCustomizeToolbarItemIdentifier,
nil ];
}

◇Controller.m → toolbarDefaultItemIdentifiers

- (NSArray *) toolbarDefaultItemIdentifiers : (NSToolbar *) toolbar {

NSLog( @"toolbarDefaultItemIdentifiers" ); // 追加

return [ NSArray arrayWithObjects :
: 以下の1行を追加
NSToolbarCustomizeToolbarItemIdentifier,
nil ];
}

改造の結果は以下のとおりです。矢印のところにアイテムが増えているのが確認できます。NSLogを埋めたのは、どういうタイミングでデリゲートメソッドが呼ばれるかを知るためのものです。NSLogの出力を見ながら色んな操作をしてみると、ツールバーの動作の理解が進むと思いますので、試してみてください。

◇改造の結果
 

 ̄ ̄ ̄ツールバーが出来上がるまで___

続いては、画面にツールバーが表示されるまでの流れを説明します。主に、ツールバー内部で自動的に行われる処理です。こちらでコーディングが必要なのは、デリゲートの部分だけです。

ツールバーをカスタマイズしたら、一旦アプリケーションを終了して、再度起動してみてください。すると、ツールバーは、カスタマイズの状態が記憶されていることが分かります。ツールバーの状態は環境設定ファイルに自動的に保存されて、同じツールバーを使おうとしたときには、カスタマイズの状態を自動的に再現してくれます ( 自動処理をオフにすることも可能です )。

初めてアプリケーションを起動した時には、環境設定ファイルはありませんので、デフォルトセットをツールバーに表示します。つまり、先程のデリゲートのメソッド ( toolbarDefaultItemIdentifiers : ) を呼んで、デフォルトセットのリストを取得します。環境設定ファイルがあった場合は、読み込んで、その中からツールバーアイテムのリストを取得します。

リストが取得できたら、次はツールバーアイテムをツールバー上に表示することになりますが、表示するためには、イメージビューならば画像とラベル、ビューアイテムならば、カスタムビューとラベルが最低限必要です。この情報を得るために、デリゲートにはもう1つメソッドが必要になります。識別子を与えるとツールバーアイテムそのもの ( インスタンス ) を返すメソッドです。ツールバーアイテムのインスタンスそのものが取得できれば、画像取得メソッド ( image ) やラベル取得メソッド ( label ) などを使って、情報を得ることが出来ます。

このインスタンス取得メソッドの詳細は以下になっています。

 ★ NSToolbarDelegate : ツールバーアイテムの識別子からインスタンスを取得
  [書式] - (NSToolbarItem *) toolbar : (NSToolbar *) toolbar
       itemForItemIdentifier : (NSString *) itemIdentifier
       willBeInsertedIntoToolbar : (BOOL ) flag
  [入力] toolbar:親のツールバーのインスタンス
     itemIdentifier:ツールバーアイテムの識別子
     flag:このツールバーアイテムをこれからツールバーに挿入するかどうか
  [出力] 返り値 : itemIdentifierに対応するツールバーアイテムのインスタンス
  [備考] このメソッドは、NSToolbarのデリゲートに必須のメソッド。
      このメソッドは、主に以下のケースで呼ばれる。
      (フレームワークのバージョンで変わる可能性がある)
       ・ツールバーがウィンドウに付けられた時 ( flag = YES )
       ・設定パネルを開いた時(全アイテムとデフォルトセットの
        両方を表示する時) ( flag = NO )
       ・ユーザーが設定パネルからツールバーにドロップした時
         ( flag = YES )

このメソッドでは、ツールバーアイテム識別子がパラメータとして与えられ、対応するインスタンスを返すわけですが、この処理のために、このサンプルでは、アプリケーションの起動時に識別子からインスタンスを取り出せる辞書 ( NSMutableDictionary ) を作成しています。詳細は後程説明しますが、Controller.mのawakeFromNibで辞書を作成しています。

◇Controller.m → awakeFromNib

- (void) awakeFromNib {
: 省略
// アイテム辞書作成
toolbarItems = [ [ NSMutableDictionary dictionary ] retain ];

// ツールバーアイテムを辞書(toolbarItems)に登録
addToolbarItem( … 省略 … ); // Font Style
addToolbarItem( … 省略 … ); // Font Size
addToolbarItem( … 省略 … ); // Blue Text
: 省略

辞書に登録しているのはカスタムアイテムの3つだけで、標準アイテムは辞書に登録していませんが、フレームワーク自身がインスタンスを持っているので、問い合わせは発生しないためです。そして、Controller.mのデリゲートメソッドは、以下のようになっています。ここでは概略だけです。

◇Controller.m → toolbar : itemForItemIdentifier : willBeInsertedIntoToolbar :

- (NSToolbarItem *) toolbar : (NSToolbar *) toolbar
itemForItemIdentifier : (NSString *) itemIdentifier
willBeInsertedIntoToolbar : (BOOL ) flag {

NSToolbarItem *newItem = [ [ [ NSToolbarItem alloc ]
initWithItemIdentifier : itemIdentifier ]
autorelease ]; // アイテムを作成
// アイテム辞書から取り出し
NSToolbarItem *item = [ toolbarItems objectForKey : itemIdentifier ];
: 省略 ( アイテムのコピー処理 )
return newItem;
}

新規にツールバーアイテムを作って、辞書の中のツールバーアイテムのコピーを作ってそれを返すようになっています。allocとinitWithItemIdentifier : で識別子指定で空のツールバーアイテムが作れます。そして、辞書からobjectForKey : でインスタンスを取り出しています。

 ★ NSToolbarItem : 識別子を指定して初期化
  [書式] - (id) initWithItemIdentifier : (NSString *) itemIdentifier
  [入力] itemIdentifier : ツールバーアイテムの識別子
  [出力] 返り値 : 初期化したNSToolbarItem

このメソッドにも以下の改造を加えてみましょう。動かしてみると、どういうタイミングでこのメソッドが呼ばれるかがよく分かると思います。

◇Controller.m → toolbar : itemForItemIdentifier : willBeInsertedIntoToolbar :

// メソッド中のどこかに追加
NSLog( @" toolbar : %@", [ toolbar identifier ] );
NSLog( @" itemForItemIdentifier : %@", itemIdentifier );
NSLog( @"willBeInsertedIntoToolbar : %@", flag ? @"YES" : @"NO" );

3つ目のパラメータのflagは、問い合わせがあったツールバーアイテムがこの後にツールバー上に登録されるかどうかを表しています。ツールバーアイテムによっては、ツールバーに登録する時に初期化が必要なものがあると思います。例えば、Mac OS XのMailアプリケーションには検索用のツールバーアイテムがありますが、このようなアイテムでは検索文字列の初期化が必要なことがありますが、このメソッド内で初期化を行うことができます。初期化すべきかどうかを、このflagで判断することができるというわけです。

◇Mailのウィンドウの検索用のツールバーアイテム
 

さて、ここまででデリゲートに実装する3つのメソッドについて見てきましたが、実は、この3つがツールバーのデリゲートの必須メソッドです。ツールバーを使うためには、この3のメソッドを必ずデリゲートに実装しておかなくてはいけません。逆にいえば、この3つのデリゲート以外の処理は、フレームワーク側で行ってくれるということなのです。
(この項続く)
[鶴薗賢吾]
関連リンクCocoaはやっぱり!