ココアでのビュー ナビゲーション、バインディングなどの概念を理解するために、いくつかのサンプル アプリケーションを作成しています。シナリオは次のとおりです。 MainMenu.Xib にタブ ビュー (2 つのタブ) を持つウィンドウがあります。最初のタブにテキスト フィールドがあり、2 番目のタブにラベルがあります。両方に同じ値を反映させ、バインディングを使用してこれを行いたいと考えています。また、提供されたビューをタブ ビューと一緒に使用したくありません。
これらは私が行った手順です。
各タブ ビュー アイテムのビューは、次のコードを使用して applicationDidFinishLaunching: メソッドで個別に設定されます。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Insert code here to initialize your application
//initialize view controllers
view1=[[ViewTab1 alloc] initWithNibName:@"ViewTab1" bundle:nil];
view2=[[ViewTab2 alloc] initWithNibName:@"ViewTab2" bundle:nil];
//set views
[[[myTabView tabViewItems] objectAtIndex:0]setView:view1.view];
[[[myTabView tabViewItems] objectAtIndex:1]setView:view2.view];
}
- myTabView は、AppDelegate の MainMenu.xib からのタブ ビューのアウトレット リファレンスです。
- ViewTab1 は、最初のビュー コントローラー (および xib) の名前です。
- ViewTab2 は、2 番目のビュー コントローラー (および xib) の名前です。
ViewTab1 には、1 つのテキスト フィールド (および関連付けられたラベル) があります。これを AppDelegate で宣言された変数 (名前) にバインドしました。ViewTab2 にはラベルがあります。これも AppDelegate の同じ変数にバインドしました。
変数「name」は、AppDelegate の init メソッドで初期化されます。
AppDelegate.h
....
NSString *name;
....
@property(strong) ViewTab1 *view1;
@property(strong) ViewTab2 *view2;
@property (assign) IBOutlet NSTabView *myTabView;
@property (strong) NSString *name;
....
AppDelegate.m
....
@synthesize myTabView;
@synthesize view1,view2;
@synthesize name;
....
- (id)init {
self = [super init];
if (self) {
name=@"dummy";
}
return self;
....
これとは別に、私は自分のプログラムでコーディングを行っていません。
ViewTab1.xib でオブジェクトを取得し、それを AppDelegate のインスタンスにしてから、Application オブジェクト (NSApplication) のデリゲート参照を同じオブジェクトに接続しました。(これが AppDelegate オブジェクトを取得する正しい方法であることを願っています。)
ViewTab2.xibでも同じことをしました
次に、ViewTab1 のテキスト フィールドと ViewTab2 のラベルを AppDelegate のこの変数にバインドします。
プログラムを実行すると、テキスト フィールドとラベルの両方に「ダミー」と表示されます。しかし、テキスト フィールドの値を変更すると、2 番目のタブ (ViewTab2) のラベルには反映されません。
私が間違っていることを教えてください。