SSブログ

Mac用USBデバイス-102 テストプロジェクトの続き [Mac用USBデバイス工作]

先日からCocoaバインディングを使ったテストアプリを考えている。今日はNSOutlineViewを使ったテスト用のユーザインターフェイスを考えてみる。

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に示す。
0518fig11.png

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を出させないようにするためだけで深い意味はない。
nice!(0)  コメント(1)  トラックバック(0) 

nice! 0

コメント 1

5 mg cialis coupon printable

沒有醫生的處方
canadian discount cialis http://kawanboni.com/ Cialis 20 mg
by 5 mg cialis coupon printable (2018-04-14 06:02) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

献立05/18献立05/19 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。