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

具体来说,我认为问题在于您的 setter 方法被调用-setCustomObject:而不是-setAnObject:. 如果您仅进行了该更改,我认为将调用 KVO,并且您的绑定文本字段将被更新。

但 Abizern 关于泄漏的说明(如果您不使用 GC)仍然适用。你的二传手应该看起来像:

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

看看这些关于Key Value 观察的文档。这应该向您展示如何以符合 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 回答