使用Swift 4的KVO中"observe"出现问题,而非使用addObserver。

6

我在使用新的KVO语法时遇到了一些问题。根据苹果文档:

创建一个观察者,为其提供关键路径并调用observe(_:options:changeHandler)方法。有关关键路径的更多信息,请参见Keys and Key Paths。

class MyObserver: NSObject {
    @objc var objectToObserve: MyObjectToObserve
    var observation: NSKeyValueObservation?

    init(object: MyObjectToObserve) {
        objectToObserve = object
        super.init()

        observation = observe(\.objectToObserve.myDate) { object, change in
            print("Observed a change to \(object.objectToObserve).myDate, updated to: \(object.objectToObserve.myDate)")
        }
    }
}

let observed = MyObjectToObserve()
let observer = MyObserver(object: observed)

observed.updateDate()

我正在进行观测初始化,代码如下:
self.observation = self.webView!.observe(\.webView.isLoading, changeHandler: { (webView, observedChange) in
    //code
})

但是我遇到了这个错误:

在此输入图片描述

2个回答

10

原来语法需要像这样,使用对象类型而不是对象实例名称:

self.observation = self.webView!.observe(\WKWebView.isLoading, changeHandler: { (webView, observedChange) in
    //code
})

误读文档 ¯\_(ツ)_/¯


3
如果你使用\.语法,根元素就是被观察的对象,所以它很简单。
self.observation = self.webView!.observe(\.isLoading, ...

编译器将你的语法解析为webView.webView.isLoading,这显然不是你想要的意思。

你应该考虑使用 self.observe(\.webView.isLoading, ...。也就是说,如果 self.webView 发生变化,你希望 KVO 自动停止观察旧的 web 视图并开始观察新视图的 isLoading 属性。 - Ken Thomases

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接