如果你告诉一个目标c对象removeObservers:对于一个关键路径并且该关键路径尚未注册,它会破坏sads.喜欢 -
'无法删除关键路径"theKeyPath"的观察者,因为它未注册为观察者.
有没有办法确定一个对象是否有一个注册的观察者,所以我可以做到这一点
if (object has observer){
remove observer
}
else{
go on my merry way
}
Run Code Online (Sandbox Code Playgroud) 我想看了在变化UIView的frame,bounds或center财产.我如何使用Key-Value Observing来实现这一目标?
我在代码中添加了一个观察者,然后在dealloc和viewWillDisappear中将其删除但是我仍然收到错误说明
***由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'类的MyController2的实例0x167e5980被释放,而键值观察者仍然注册了它.
Run Code Online (Sandbox Code Playgroud)Current observation info: <NSKeyValueObservationInfo 0x16719f90> ( <NSKeyValueObservance 0x16719fb0: Observer: 0x167e5980, Key path: dataContainer.report, Options: <New: YES, Old: YES, Prior: NO> Context: 0x0, Property: 0x1677df30> )'
我创建了一个控制器,MyController并从中派生出一个新的控制器MyController2.现在我加入了KVO MyController2.
- (void)viewDidLoad {
[super viewDidLoad];
[self addObserver:self forKeyPath:@"dataContainer.report" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
}
Run Code Online (Sandbox Code Playgroud)
然后在observeValueForKeyPath中: -
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
id oldC = [change objectForKey:NSKeyValueChangeOldKey];
id newC = [change objectForKey:NSKeyValueChangeNewKey];
if([keyPath isEqualToString:@"dataContainer.report"]) {
if (oldC != newC) {
//Remove Observer …Run Code Online (Sandbox Code Playgroud)