检测属性中的对象何时更改了目标C.

时间:2015-03-09 10:45:08

标签: ios objective-c pointers

我有一个问题,我认为答案是否定的,但我想确定。当类的属性值从另一个类更改时,有没有办法触发方法? 一个例子,在iOS中:

我已获得FirstViewController,从服务器获得NSString并将其保存为@property NSString helloString。但它也使用NSSUserDefaults在本地保存它,因此当用户进入应用程序时,他会看到本地保存的最后helloString,当服务器回答时(让我们说5秒后更新)它会更新这个helloString属性。

想象一下,用户转到SecondViewController(我们在helloString中通过prepareForSegue FirstViewController传递,并在SecondViewController中保存为属性。 SecondViewController显示已保存的helloString,并在5秒后服务器回答并更新helloString中的FirstViewController属性(当然还有SecondViewController)。

NSNotificationCenterSecondServerController值发生变化时,是否有任何方式(我认为我可以使用helloString)在FirstServerController中触发方法?

编辑:

KVO不是有效选项,因为如果我们有ThirdViewController并且用户从FirstViewController转到SecondViewController,最后转到ThirdViewController,然后返回{{ 1}}经过FirstViewControllerSecondViewcontroller内的[FirstViewController removerObserver:forKeyPath:]方法会崩溃,因为SecondViewController已从内存中释放。

感谢您的时间。

3 个答案:

答案 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中观察到的通知,如果其中任何一个发布,则不会导致应用崩溃。