是否可以在Cocoa Touch中观察对象的只读属性?

use*_*937 19 iphone cocoa-touch properties key-value-observing

我试图观察UINavigationController的(readonly)visibileViewController属性但没有成功.我能够成功地观察到我自己定义的读写属性,以便在另一个类上进行测试.

是否有可能观察到readonly属性?

Bar*_*ark 22

是的,可以观察只读属性.但是,如果声明该属性的对象以不符合键值观察的方式更改该属性的值(例如,更改直接支持该属性的实例变量的值而不进行seding willChangeValueForKey:didChangeValueForKey:通知),那么观察者将不会自动通知KVO系统.如果您可以验证此属性的值是否正在更改并且您的观察者未收到通知,我会(1)在此处或其他地方发布一些代码,以便其他人可以帮助您找到您的错误,以及(2)如果没有错误你的代码,在Apple的雷达上提出一个错误.


Ant*_*erg 15

是.在您自己的类中实现它的一种简单方法是在.h文件中将该属性声明为readonly,并在.m文件的私有接口中将其重新声明为可写.这样您就可以合成并自动处理更改通知.

在.h文件中:

@interface MyClass : NSObject
@property (nonatomic, readonly) BOOL foo;
@end
Run Code Online (Sandbox Code Playgroud)

在.m文件中

@interface MyClass ()
@property (nonatomic, readwrite) BOOL foo;
@end

@implementation MyClass

@synthesize foo;

- (void)bar {
    // Observers will see the change
    self.foo = YES;
}

@end
Run Code Online (Sandbox Code Playgroud)


Nic*_*dad -2

使用NSKeyValueObserving这绝对是可能的。属性实际上有 getter/setter 实现,它们只是由编译器通过 Objective-C 类实现中的 @synthesize 关键字为您完成。由于键值观察协议基​​于 Objective-C 中的标准 getter/setter 约定,因此观察属性效果很好。文档(上面链接)甚至按名称提到了类属性:

“NSKeyValueObserving (KVO) 非正式协议定义了一种机制,允许对象收到其他对象指定属性更改的通知。”