Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用KVO更改属性时发送通知_Ios_Objective C_Properties_Key Value Observing - Fatal编程技术网

Ios 使用KVO更改属性时发送通知

Ios 使用KVO更改属性时发送通知,ios,objective-c,properties,key-value-observing,Ios,Objective C,Properties,Key Value Observing,我的类中有一个名为myName的属性,如: @property (nonatomic, strong) NSString *myName; 当myName属性的值更改时,我需要发送通知 现在我在做一些类似的事情: - (void)setMyName:(NSString *)name { _myName = name; [[NSNotificationCenter defaultCenter] postNotificationName:CHANGE_NOTIFICATION object

我的类中有一个名为
myName
的属性,如:

@property (nonatomic, strong) NSString *myName;
myName
属性的值更改时,我需要发送通知

现在我在做一些类似的事情:

- (void)setMyName:(NSString *)name
{
  _myName = name;
  [[NSNotificationCenter defaultCenter] postNotificationName:CHANGE_NOTIFICATION object:nil];
}
我知道iOS中有类似的东西。但我不知道如何实现它,我阅读了整个文档,但没有得到很好的理解

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

尝试以下操作:

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属性在
-(void)setMyName:(NSString*)name中更改时,将随时调用此方法。请改为执行此操作

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

//this generates the KVO's
在您想要收听的位置(viewController),在viewDidLoad中添加以下行:

[w addObserver:self-forKeyPath:@“myName” 选项:NSKeyValueObservingOptionNew context:nil]

//通过执行此操作,可以注册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 :)
    }
}
//只要属性的值发生更改,就会调用此方法


要在没有客户设置器的情况下完成此操作,只需合成属性设置器。这将创建对willChangeValueForKey/didChangeValueForKey的所有支持调用

@myName

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

self.myName=@“Inigo Montoya”

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


(在释放观察对象之前,您需要删除观察者。)

您好,我想知道KVO解决方案是否比其他实现解决方案更好。有人能解释吗?@NiCTesla:这正是我的想法。只有在没有其他机制可以执行此任务时,才应使用AFAIR KVO(此处以NSOperation为例)。我还认为通知会产生更容易理解、更不容易出错的代码。这个答案比公认的答案要好得多,后者没有说明如何实现KVO,只说明如何侦听已经实现的KVO通知