ios - KVO 不工作 : message was received but not handled

标签 ios swift macos

我在使用 KVO 时遇到以下错误。它只适用于 UIViewController 的子类吗?

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '<sort.object: 0x100a074e0>: An -observeValueForKeyPath:ofObject:change:context: message was received but not handled.
Key path: name
Observed object: <sort.User: 0x100a06bb0>
Change: {
    kind = 1;
    new = Test;
}

代码如下:

import Foundation

class User: NSObject {
    dynamic var name: String?
}

class object: NSObject {
    func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutableRawPointer) {
        print("Name changed")
    }
}


var user = User()
var ob = object()
user.addObserver(ob, forKeyPath: "name", options: NSKeyValueObservingOptions.new, context: nil)

user.name = "Test"

try user.name = "Test 2"
user.removeObserver(ob, forKeyPath: "name")

最佳答案

根据docs ,该方法的名称是 observeValue(forKeyPath:of:change:context:)。请注意 of:,而不是您所使用的 ofObject:。您的方法不是所需方法的实现。我相信您需要使用 override 标记正确命名的方法(事实上,编译器会让您在没有该方法的情况下逃脱,这表明您的名称错误)。

关于ios - KVO 不工作 : message was received but not handled,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43488048/

相关文章:

ios - 如何在 iOS 应用程序中使用支付网关而不被苹果拒绝?

swift - 如何在 wkWebView Swift 中将本地 CSS 应用到 HTML 内容中

swift - 如何使用从 Core Data 创建的 NSSet

ios - 插入蓝牙耳机时 AVAudioEngine 使用错误的格式

macos - 如何为嵌套的 [NSObject : AnyObject] dictionaries? 赋值

ios - Split View Controller 只显示一个 childviewcontroller

ios - 在 Swift2 中获取不带扩展名的文件名的重大更改

ios - Google PlacePicker API - 小数点后的地理坐标精度(Swift 3.0)

swift - 什么是 UIAlertController 处理程序以及如何使用它?

ios - 如何在 swift 2.2 中将带有图像的 json 发布到外部服务器?