2013-02-14 49 views
15

我有一个名为myName在我的类属性,如:发送通知当一个属性更改使用志愿

@property (nonatomic, strong) NSString *myName; 

我需要当myName属性的值更改为发送通知。

现在我正在做这样的事情:

- (void)setMyName:(NSString *)name 
{ 
    _myName = name; 
    [[NSNotificationCenter defaultCenter] postNotificationName:CHANGE_NOTIFICATION object:nil]; 
} 

我知道有类似iOS中Key-Value Observing。但我不知道如何实现它,我阅读了整个文档,但无法得到很好的理解。

请帮助我了解如何在不使用自定义setter的情况下实现它。

回答

31

试试这个:

MyClass *var = [MyClass new]; 
[var addObserver:self forKeyPath:@"myName" options:NSKeyValueChangeOldKey context:nil]; 

和实施

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 

} 

时MYNAME属性更改

+0

谢谢您的回答:) – 2013-02-14 10:50:41

+0

欢迎你) – alex 2013-02-14 11:50:06

+0

您好,我想知道如果国际志愿者组织的解决方案是更好的那么其他实施解。任何人都可以解释吗? – NicTesla 2015-03-25 08:21:07

15

- (void)setMyName:(NSString *)name做这个方法会被随时叫,而不是

[self willChangeValueForKey:@"myName"]; 
_myName = name; 
[self didChangeValueForKey:@"myName"]; 

//this generates the KVO's 

而且要听(在的viewController),在viewDidLoad中有加入这一行:

[W的addObserver:自forKeyPath:@ “MYNAME” 选项:NSKeyValueObservingOptionNew方面:零]

//通过这样做,您注册viewController以收听KVO。

,并实现此方法:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if ([[change objectForKey:NSKeyValueChangeNewKey] isEqual:[NSNull null]]) { 
     return; 
    } else { 
     //read the change dictionary, and have fun :) 
    } 
} 

//调用此方法,每当属性的值被改变。

+0

感谢您的回答:) – 2013-02-14 10:51:03

+3

这个答案比接受的答案要好得多,它没有说明如何实现KVO,只知道如何听已经实施的KVO notifs – Chris 2015-03-26 01:10:53

7

要做到这一点没有客户设置,只需综合属性设置器。这将创建对willChangeValueForKey/didChangeValueForKey的所有支持调用。

@synthesize myName;

然后设置属性值用点语法:

self.myName = @ “伊尼戈蒙托亚”

然后观察者将自动接收KVO通知。

(你需要释放你的观察对象之前删除的观察者。)

+0

感谢您的回答:) – 2013-02-14 11:16:25