我有一个问题,我认为答案是否定的,但我想确定。当类的属性值从另一个类更改时,有没有办法触发方法? 一个例子,在iOS中:
我已获得FirstViewController
,从服务器获得NSString
并将其保存为@property NSString helloString
。但它也使用NSSUserDefaults
在本地保存它,因此当用户进入应用程序时,他会看到本地保存的最后helloString
,当服务器回答时(让我们说5秒后更新)它会更新这个helloString
属性。
想象一下,用户转到SecondViewController
(我们在helloString
中通过prepareForSegue
FirstViewController
传递,并在SecondViewController
中保存为属性。 SecondViewController
显示已保存的helloString
,并在5秒后服务器回答并更新helloString
中的FirstViewController
属性(当然还有SecondViewController
)。
在NSNotificationCenter
中SecondServerController
值发生变化时,是否有任何方式(我认为我可以使用helloString
)在FirstServerController
中触发方法?
编辑:
KVO不是有效选项,因为如果我们有ThirdViewController
并且用户从FirstViewController
转到SecondViewController
,最后转到ThirdViewController
,然后返回{{ 1}}经过FirstViewController
,SecondViewcontroller
内的[FirstViewController removerObserver:forKeyPath:]
方法会崩溃,因为SecondViewController
已从内存中释放。
感谢您的时间。
答案 0 :(得分:3)
实际上,答案是肯定的,你可以用Key-Value observing来做到这一点。
在prepareForSegue中,您可以添加观察者:
[self addObserver:destinationViewController forKeyPath:@"helloString" options:<#(NSKeyValueObservingOptions)#> context:NULL];
现在,当helloString发生变化时,方法observeValueForKeyPath:ofObject:change:context:
将在SecondViewController中调用。
答案 1 :(得分:2)
在你的情况下,KVO会有点矫枉过正。您可以简单地覆盖属性的setter方法。
例如,在SecondViewController.h中,您拥有属性:
@property (strong, nonatomic) NSString *helloString;
在SecondViewController.m文件中,添加方法:
-(void)setHelloString:(NSString*)helloString {
//This method gets called when the helloString property is assigned a value.
//Save the value in the iVar
_helloString = helloString;
//Take whatever other action that is necessary.
}
答案 2 :(得分:0)
对于我的情况,答案不是KVO或自定义设置器。我最后使用[NSNotificationCenter defaultCenter]
并发布FirstViewController
中将在SecondViewController
中观察到的通知,如果其中任何一个发布,则不会导致应用崩溃。