【问题标题】:Trouble using swift 4's KVO "observe" instead of addObserver使用 swift 4 的 KVO“观察”而不是 addObserver 时遇到问题
【发布时间】:2018-03-29 18:47:05
【问题描述】:

我在正确获取新的 KVO 语法时遇到了一些问题。 根据 Apple 文档:

为关键路径创建一个观察者并调用 观察(_:options:changeHandler) 方法。有关密钥的更多信息 路径,请参阅键和键路径。

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
})

但出现此错误:

【问题讨论】:

    标签: swift4 key-value-observing observers keypaths


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      如果你使用\. 语法,根元素就是观察对象,所以它很简单

      self.observation = self.webView!.observe(\.isLoading, ...
      

      编译器将您的语法视为webView.webView.isLoading,这显然不是故意的。

      【讨论】:

      • 您应该考虑使用self.observe(\.webView.isLoading, ...。也就是说,如果self.webView 发生变化,您希望KVO 自动停止观察旧的Web 视图并开始观察新的isLoading 属性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-02
      • 2023-03-28
      • 2014-07-28
      相关资源
      最近更新 更多