昨日骨組みだけ書いてあったNSToolbarのdelegateメソッド、本日少し書いてみた。といってもADCのサンプルからコピペしたコードが多い。ま、コピペするにもそれなりの取捨選択と事前作業が必要なので、それほど悲観することもないだろう。
- (NSToolbarItem *) toolbar: (NSToolbar *)toolbar itemForItemIdentifier: (NSString *) itemIdent willBeInsertedIntoToolbar:(BOOL) willBeInserted { NSToolbarItem *toolbarItem = nil; if([itemIdent isEqual: SearchDocToolbarItemIdentifier]) { // NSToolbarItem doens't normally autovalidate items that hold custom views, but we want this guy to be disabled when there is no text to search. toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdent] autorelease]; // Set up the standard properties [toolbarItem setLabel: @"Search"]; [toolbarItem setPaletteLabel: @"Search"]; [toolbarItem setToolTip: @"Search Your Document"]; searchFieldOutlet = [[NSSearchField alloc] initWithFrame:[searchFieldOutlet frame]]; // Use a custom view, a text field, for the search item [toolbarItem setView: searchFieldOutlet]; [toolbarItem setMinSize:NSMakeSize(30, NSHeight([searchFieldOutlet frame]))]; [toolbarItem setMaxSize:NSMakeSize(200,NSHeight([searchFieldOutlet frame]))]; [toolbarItem setTarget:self]; [toolbarItem setAction:@selector(beginSearch:)]; } return toolbarItem; } - (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar { return [NSArray arrayWithObjects:NSToolbarFlexibleSpaceItemIdentifier, SearchDocToolbarItemIdentifier, nil]; } - (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *) toolbar { return [NSArray arrayWithObjects:NSToolbarFlexibleSpaceItemIdentifier,SearchDocToolbarItemIdentifier, nil]; }これだけでサーチフィールドが表示できた。
あとはactionを実装していくわけだが、InterfaceBuilderでNSSearchFieldのSendsWholeSearchStringを有効にしても、キーボードから1文字入力するたびにいちいちactionが呼ばれているのはなぜだろう。この辺は実際に作ってみればわかるか。
NSToolbarはけっこう重要なUIクラスらしい、とだんだんわかってきた。OSXのアプリってWinアプリのようなToolbarの使われ方(MenuのショートカットUI版、とでも言うか)をしていない、という印象が強いのだが、
[toolbar setDisplayMode: NSToolbarDisplayModeLabelOnly]
で使われていることがけっこうあるみたい、と気づいた。早い話、Xcode4で⌘+Fを押したら出てくる検索バー、
ついでにそのすぐ上の「ファイル・クラス・メソッドのセレクタ」も同じく NSToolbarDisplayModeLabelOnly、と思われる。使い方を勉強する価値が十分にある、ということね。
0 件のコメント:
コメントを投稿