1

我有一NSObject堂课NSStringsUIImages。我通过从服务器下载数据来填充它们。我在管理器类中所做的,我下载一个 JSON 并将其解析NSObject为填充基本NSString& UIImages。然后我在NSObject的类中启动一个方法,从另一台服务器下载更复杂的数据并将其NSObject放入NSMutableDictionary. 所以我最终得到的是一本充满我的字典NSObjects,其中一些数据已经下载,一些数据仍在下载。

然后我尝试将 in 的数据输入到NSObject另一个类(视图控制器)中。但是,某些数据可能仍在加载,因此 UILabels 将显示为空,例如,如果应该填充的数据尚未下载。UILabelsUIImageViewsNSString

现在我的问题是,一旦在它的类中下载(重新设置),我怎样才能UILabels再次更改 's 的文本?基本上我需要从' 类中“观察” '的值。我发现了这样的东西:NSStringNSObjectNSObjectNSStringUILabel

observeValueForKeyPath:ofObject:change:context

但我不知道如何使用它。我知道我必须在 ' 类中实现它,但是当它观察到' 的变化时UILabel,如何以及如何设置它以更新UILabel' 文本?NSObjectNSString

我也读过一些关于NSObjectController类的东西,它适用于这里吗?

先感谢您!

4

3 回答 3

1

你已经很接近了——你想要的叫做key-value observing,它在Key-Value Observing Programming Guide中有详细描述。为此,您不需要 NSObjectController - 相反,让管理 UILabel 视图的视图控制器将自己添加为其他类的观察者,然后在收到observeValueForKeyPath:ofObject:change:context消息时更新 UILabel 文本。

于 2012-11-12T22:08:29.513 回答
1

基本上你需要在你的UILabel子类中实现以下内容:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"nameOfThePropertyInYourNSObjectSubclass"]) {
        id changedValue = [object valueForKeyPath:keyPath];
        //do what ever you want with it
    }
}

此外,要为 KVO 注册您的NSObject子类,您需要实现:

[self addObserver:yourUILabel forKeyPath:@"nameOfThePropertyOfYourString" options:NSKeyValueObservingOptionNew context:NULL];

请注意,您还必须在适当的时间取消注册观察者(取决于您的设计):

[self removeObserver:yourUILabel forKeyPath:@"nameOfThePropertyOfYourString" context:NULL];

另请注意,虽然 KVO 是一个简洁的东西,并且在某些情况下非常有用,但选择它并不是一件容易的事。特别是在您的情况下,我建议您改用回调。从网络获取数据最好在后台线程中完成,在这种情况下,我会使用委托模式来通知您的视图控制器,新数据可用并让视图控制器负责更新您的标签。

于 2012-11-12T22:19:55.057 回答
0

KVO 是可能的,但也可以查看委托模式。我相信这里会更简单。

于 2012-11-12T22:24:38.793 回答