在另一个类中更改NSString时更新UILabel文本

时间:2012-11-12 21:59:39

标签: iphone ios nsstring uilabel nsobject

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

然后,我尝试将NSObject的数据提供给UILabels,并将UIImageViews提供给另一个类(视图控制器)。但是,有些数据可能仍然会被加载,因此如果例如应该填充它的NSString将不会被下载,那么UILabel将显示为空。

现在我的问题是,一旦下载(重置)UILabels类中的NSString后,如何再次更改NSObject的文字?基本上我需要从NSObject的类中“观察”NSString的{​​{1}}的值。我发现了这样的事情:

UILabel

但我不知道如何使用它。我知道我必须在observeValueForKeyPath:ofObject:change:context 的类中实现它,但是当它观察到{{1}中的更改时,如何设置它以更新UILabel的文本我的UILabel

我也读过有关NSObject课程的内容,这里适用吗?

提前谢谢!

3 个答案:

答案 0 :(得分:1)

你非常接近 - 你想要的是键值观察,并在Key-Value Observing Programming Guide中详细描述。你不需要NSObjectController - 相反,让视图控制器管理UILabels的视图将自己添加为另一个类的观察者,然后只要你收到observeValueForKeyPath:ofObject:change:context消息就更新UILabel文本。 / p>

答案 1 :(得分: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是一个整洁的东西,在某些情况下非常有用,但选择它并不是一件容易的事情。特别是在你的情况下,我建议使用回调代替。从网络中获取数据最好在后台线程中完成,在这种情况下,我会使用委托模式通知您的视图控制器,新数据可用,并让视图控制器负责更新您的标签。

答案 2 :(得分:0)

可以使用KVO,但也可以查看委托模式。我相信这会更简单。