1

ココアでのビュー ナビゲーション、バインディングなどの概念を理解するために、いくつかのサンプル アプリケーションを作成しています。シナリオは次のとおりです。 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) のラベルには反映されません。

私が間違っていることを教えてください。

4

3 に答える 3

0

NSTextFieldコントロールで「継続的に値を更新」をオンにしましたか?

この例を参照してください。

于 2012-07-26T10:28:44.217 に答える
0

問題は、アプリ デリゲート クラスに設定した xib 内のオブジェクトが、アプリ デリゲートの 2 つの異なるインスタンスを作成するため、テキスト フィールドの値を変更すると、一方のインスタンスでは name の値が変更されますが、他方では変更されないことだと思います。残念ながら、現時点では解決策が思いつきません。

于 2012-07-27T01:14:52.877 に答える