我的NSObject
课程有NSStrings
和UIImages
。我通过从服务器下载数据来填充它们。我在经理类中做的是,我下载了一个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
课程的内容,这里适用吗?
提前谢谢!
答案 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,但也可以查看委托模式。我相信这会更简单。