将观察者设置为对象更改

时间:2015-12-24 05:13:20

标签: ios objective-c swift

我正在寻找一种方法,我可以创建一个方法,只有当任何更改应用于对象时才会调用

例如让我们拿一个标签。我在不同情况下更改此标签的文字。现在我需要我创建一个方法:

- (void)labelTextChangeNotification {

}

每次我的标签文字发生变化时都会调用 我可以使用NSNotification来获取此信息。对于NSNotification,我们需要发布通知。 我的要求就像Observer一样,观察我的标签文本变化。 有没有办法得到这个??

2 个答案:

答案 0 :(得分:1)

您可以尝试使用键值观察(KVO):

[label addObserver:self
    forKeyPath:@"text"
       options:NSKeyValueObservingOptionNew
             | NSKeyValueObservingOptionOld
       context:NULL];

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"text"]) {
    /* etc. */
}
}

当您更改label的值时,将调用此observervalue方法。 同样在更改词典中,您将找到所有细节。

答案 1 :(得分:1)

要接收属性的键值观察通知,需要做三件事:

  1. 观察到的类必须符合键值观察 您希望观察的财产。

  2. 您必须使用观察对象注册观察对象, 使用方法addObserver:forKeyPath:options:context:

  3. 观察班必须实施 observeValueForKeyPath:ofObject:change:context:

  4.   

    为了获得对属性,观察对象的更改的通知   必须首先通过发送它来注册要观察的对象   addObserver:forKeyPath:options:context:消息,传递观察者   对象和要观察的属性的关键路径。选项   参数指定提供给观察者的信息   何时发送更改通知。使用选项   NSKeyValueObservingOptionOld指定原始对象值   作为更改字典中的条目提供给观察者。   指定NSKeyValueObservingOptionNew选项可提供新选项   值作为更改字典中的条目。要同时接收这两个值,   你会按位OR选项常量

    从Apple doc

    引用

    因此,当UILabel的文字发生变化时,您可以使用 KVO : -

    [labelName addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew context:NULL];
    

    只要标签文字发生变化,此方法就会通知: -

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    
        NSLog(@"the text has been changed");
    }