Mac用USBデバイス-102 テストプロジェクトの続き [Mac用USBデバイス工作]
先日からCocoaバインディングを使ったテストアプリを考えている。今日はNSOutlineViewを使ったテスト用のユーザインターフェイスを考えてみる。
ただのボタンではなくてPopupButtonにするのはウィンドウの上を整理するためで、別に普通のボタンを並べてもいいけど、最終的な実際のアプリではデスクリプタは7種類もあるので、ポップアップにすればひとつにまとめることができてボタンよりいい。
MainMenu.xibの上に
NSOutlineViewにはNSTableColumnを一つだけにして"name" というタイトルを付ける。ここに要素オブジェクトのnameインスタンス変数を反映させる。
Interface Builderで編集中のアプリウィンドウを図-11に示す。
このデリゲートは
ちなみに上のコードの中でidをキャストしてるのは、コンパイラのwarningを出させないようにするためだけで深い意味はない。
5.3.7 User Interface
テスト用なんであまりごちゃごちゃさせないようにする。アプリウィンドウにNSOutlineViewとNSPopupButtonを乗せる。ポップアップには- add Extra Node
- add Other Node
ただのボタンではなくてPopupButtonにするのはウィンドウの上を整理するためで、別に普通のボタンを並べてもいいけど、最終的な実際のアプリではデスクリプタは7種類もあるので、ポップアップにすればひとつにまとめることができてボタンよりいい。
MainMenu.xibの上に
- NSApplicationのデリゲートオブジェクト
- NSTreeController(のサブクラス)のインスタンス
NSOutlineViewにはNSTableColumnを一つだけにして"name" というタイトルを付ける。ここに要素オブジェクトのnameインスタンス変数を反映させる。
Interface Builderで編集中のアプリウィンドウを図-11に示す。
5.3.8 デリゲートオブジェクト
mainMenu.xibの上に乗せておいたNSApplicationのデリゲートは#import "Node.h" @interface AppDelegate : NSObject { Node *rootNode; IBOutlet id popupButton; IBOutlet id controller; } @endで、Nodeオブジェクトツリーのトップレベルオブジェクトを保持している。controllerというアウトレットはNSTreeCotroller(のサブクラス)を、popupButtonはウィンドウのポップアップメニューを指している。アウトレットをInterface Builderで接続することを忘れないようにする(忘れてなんで動かないのかと慌てることがよくある)。
このデリゲートは
- (void)awakeFromNib { rootNode = [[Node alloc] init]; [NSApp setDelegate:self]; }でrootNodeを作っておく。また、アプリが立ち上がったときに呼ばれるデリゲートメソッドで
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { [controller setContent:rootNode]; [(id)[popupButton itemWithTitle:@"Extra"] setAdditionalObject:[ExtraNode class]]; [(id)[popupButton itemWithTitle:@"Other"] setAdditionalObject:[OtherNode class]]; }と設定する。このメソッドはNSApplicationのインスタンスがMainMenu.xibのインスタンスをすべて実体化し終えて、それぞれのawakeFromNibメソッドを全部呼んだ後に呼ばれる。まず、controllerのcontentを設定している。これはInterface Builderのパネルからでもできる。そのあとポップアップボタンのひとつのアイテムであるNSMenuItemをタイトルを手がかりに取り出して、そのオブジェクトにsetAdditionalObject:を呼んで対応するクラスオブジェクトを設定している。これは余分なオブジェクトを保持するようなNSMenuItemのサブクラスを作っておいて、その設定をするメソッドとしてsetAdditionalObject: を書いた。ちょうどrefConみたいなものである。前書いたようなタイトルそのものをクラスの名前にするよりこっちの方がいいだろう。もちろんタイトル文字列やタグの数値から連想的にクラスを返すような辞書なり配列なりを作っておいてもいいし、前書いたようにポップアップのアイテムが別々の専用メソッドを呼ぶようにしてもいいが、僕にはこのNSMenuItemのサブクラスを作るやり方が一番簡単に思える。
ちなみに上のコードの中でidをキャストしてるのは、コンパイラのwarningを出させないようにするためだけで深い意味はない。
2010-05-18 22:10
nice!(0)
コメント(1)
トラックバック(0)
沒有醫生的處方
canadian discount cialis http://kawanboni.com/ Cialis 20 mg
by 5 mg cialis coupon printable (2018-04-14 06:02)