UIWebView KVO是否合规?

iai*_*ain 8 cocoa-touch key-value-observing uiwebview

我已经设置了KVO通知来观看UIWebView的一些属性,就像这样

[webView addObserver:self 
          forKeyPath:@"canGoBack"
             options:NSKeyValueObservingOptionNew
             context:NULL];
Run Code Online (Sandbox Code Playgroud)

并有

- (void)observeValueForKeyPath:(NSString *)keyPath 
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context
Run Code Online (Sandbox Code Playgroud)

但它永远不会被召唤.我错过了什么或UIWebView是不可观察的?

sam*_*m-w 11

canGoBack是一个readonly属性:为了使它符合KVO,它必须readwrite在其实现中重新声明该属性,然后通过合成的setter设置属性.我怀疑它canGoBack只是通过它的ivar设置,它不会通过KVO系统发送通知:

[self setCanGoBack:YES]; // Would notify KVO observers (as long as any reimplementation of automaticallyNotifiesObserversForKey does place restrictions)
_canGoBack = YES; // Would not notify KVO observers
Run Code Online (Sandbox Code Playgroud)

这个相关的问题详细讨论了这个问题:是否可以在Cocoa Touch中观察对象的只读属性?

作为一种变通方法,您可以设置一个UIWebViewDelegate检查的价值[UIWebView canGoBack][UIWebViewDelegate webViewDidFinishLoad:].

  • 虽然'UIWebView`与`canGoBack`不符合KVO可能是正确的,但你的解释却不是.实现可观察的只读属性绝对是可能的(并且是常见的)(例如,参见NSOperationQueue的`operations`).可观察性与readwrite/readonly无关.正确的答案是除非文件明确说明,否则没有任何东西是可观察的. (6认同)
  • 我的答案中哪一部分不正确?"可观察性与readwrite/readonly无关":同意,这就是为什么我解释一个属性`readonly`可以间接影响可观察性的原因. (2认同)
  • 嗯,我同意,这有点误导。可观察到`canGoBack`是可耻的,但是它根本不是*,因为它是一个只读属性。它只是不可观察的,它的“原因”隐藏在UIWebView的实现背后。 (2认同)