【问题标题】:Key-Value Observer not changing on its own propertyKey-Value Observer 自身属性不变
【发布时间】:2015-04-21 22:18:49
【问题描述】:

我正在尝试在名为“currentTopViewPosition”的属性发生更改时获取通知。我使用以下代码注册更改并接收它们:

[self addObserver:self 
forKeyPath:@"currentTopViewPosition" 
options:NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld|NSKeyValueObservingOptionPrior 
context:NULL];

那么接收方:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    NSLog(@"Key Path: %@\n change: %@",keyPath, change);
}

但没有任何记录。

我通过使用 NSTimer 每 5 毫秒打印出它的值并且它正在改变来测试以确保该值实际上正在改变。

我似乎从来没有让键值观察工作,所以我做错了什么吗?漏了一步?

谢谢!

【问题讨论】:

  • UIKit 不保证与 KVO 兼容
  • @danielbeard 但是这包括什么?这是 uiviewcontroller 子类中的自定义属性,是否会取消它的资格?
  • 如何计算?您能说明currentTopViewPosition 的定义位置吗?
  • @danielbeard 其定义如下:@property (nonatomic, assign, readonly) ECSlidingViewControllerTopViewPosition currentTopViewPosition; 它是 1 或 0(由常量定义)
  • 在那个类中,你是把属性重新声明为readwrite还是直接使用ivar?

标签: cocoa-touch key-value-observing


【解决方案1】:

创建属性的最简单方法是在implementation 文件中将属性重新声明为readwrite

@property (nonatomic, readwrite, assign) ECSlidingViewControllerTopViewPosition currentTopViewPosition;

然后在设置值时,请确保使用属性设置器。例如。 self.currentTopViewPosition = 1

如果您直接使用 ivar 手动设置值,则必须手动生成 KVO 调用。像这样:

[self willChangeValueForKey:@"currentTopViewPosition"];
_currentTopViewPosition = 1;
[self didChangeValueForKey:@"currentTopViewPosition"];

【讨论】:

  • 好的,谢谢,那么使用它的_currentTopViewPosition 设置属性只是直接设置iVar 吗?
  • 是的,setter 是自动生成的并处理 KVO、原子/非原子和存储(在本例中为分配)。
猜你喜欢
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多