1

バインディングを使用して、動的にロードされたオブジェクトとGUIを同期させたいのですが、問題のオブジェクトを同じタイプの別のオブジェクトに置き換えるとすぐに、バインディングが壊れてGUIの更新が停止します。私が何を意味するのかを理解するのに役立つコードを次に示します。

私のインターフェースには、問題のオブジェクトを保持するためのインスタンス変数があります。

@interface AppDelegate : NSObject {
    CustomObject *anObject; // This object has a "NSString *textValue" property
}

次に、私の実装では、オブジェクトをインスタンス化します。

- (id) init {
    self = [super init];
    if (self != nil) {
        anObject = [[CustomObject alloc] init];
    }
    return self;
}

Interface Builderには、「anObject.textValue」にバインドされたテキストフィールドの「値」があります。

このメソッドを呼び出すと:

[anObject setValue:@"Changed anObject.textValue!" forKey:@"textValue"];

次に、テキストフィールドが更新され、新しい値が反映されます。

しかし、私がやりたいのは、アプリケーションの他の場所でいくつかの作業を行った後に与えられたオブジェクトからの値を表示することです。だから私がしたことはこれでした:

- (void)setCustomObject:(CustomObject *)newObject {
    anObject = newObject;
}

この操作の結果は、GUIからCustomObjectインスタンス(anObject)へのバインディングを壊しているように見えます。これは、バインドされたオブジェクトが別のインスタンスに置き換えられたことを考えると論理的です。

私が知りたいのは、動的に作成されたCustomObjectのインスタンスでバインディングを機能させ続ける方法があるかどうかです。プログラムですべてのコントロールを再バインドするbind:toObject:forKeyPath:options:必要はなく、(私の知る限り)IBOutletsを使用して取得する必要があります。コントロールを保持して、新しいオブジェクトの値にバインドできるようにします(IMOを使用すると、このバインドは私の状況では役に立たなくなります)。これが唯一の解決策ですか、それともこれに対処するためのより良い、よりクリーンな方法がありますか?

バインディングに関してdevelopper.apple.comや他の場所でたくさんのドキュメントを読みましたが、この特定のケースについて話しているように見えるものは何も見つかりませんでした。

よろしくお願いします!

4

2 に答える 2

3

具体的には、問題は、の-setCustomObject:代わりにsetterメソッドが呼び出されたことだと思います-setAnObject:。その変更を行った場合、KVOが呼び出され、バインドされたテキストフィールドが更新されると思います。

ただし、リークに関するAbizernのメモ(GCを使用していない場合)は引き続き適用されます。代わりに、セッターは次のようになります。

- (void)setAnObject:(CustomObject *)newObject {
    if (anObject != newObject) {
        [anObject release];
        anObject = [newObject retain];
    }
}
于 2009-09-21T22:44:11.223 に答える
1

KeyValueの監視に関するこれらのドキュメントをご覧ください。これにより、KVOに準拠した方法でプロパティを変更する方法がわかります。

または、anObjectをプロパティとして設定します。

@interface AppDelegate : NSObject {
    CustomObject *anObject; // This object has a "NSString *textValue" property
}
@property (retain) CustomObject *anObject;
...
@end

@interface AppDelegate
@synthesize anObject;

...
@end

次に、anObjectインスタンスを変更するときは、プロパティ構文を使用します。

self.anObject = newObject;

これはあなたのためにKVOのものの世話をします。

注:GCをオンにしていない限り、setCustomObject:メソッドリークが発生します。

于 2009-09-21T22:20:08.843 に答える