从 macOS 14.0 收到一些崩溃报告。深入挖掘后,我发现问题与键路径绑定(
NSDisplayPatternValueBinding
)与NSObjectController
和NSTextView
有关。我将 NSTextView
绑定到 Storyboard 中的 NSObjectController
并在代码中设置 NSObjectController
的内容。内容是一个简单的 String
包装。
当我将 keypath 与“dot”(text.length)一起使用时,就会出现问题。如果我在从笔尖取消存档期间为已知的系统定义的文本替换(“在我的路上!”)设置字符串值 - 应用程序将崩溃并显示以下错误消息。但是,如果该值不在文本替换字典中,则不会崩溃。同样,对于简单的非点键路径,它也不会崩溃。如果我将模型对象更改为
NSString
,它不会崩溃
这是 macOS Sonoma 错误还是我以不应该的方式使用了绑定?
KVOTextViewIssue[62553:2549739] 无法在 (NSWindow) 上设置 (contentViewController) 用户定义的检查属性:无法为观察者
最小可重现示例:
final class DymmyObject : NSObject {
@objc dynamic var text : String = "On my way!" //CRASHES
//@objc dynamic var text : NSString = "On my way!" //DOES NOT CRASH
//@objc dynamic var text : String = "Hello" //DOES NOT CRASH
}
class ViewController: NSViewController {
@IBOutlet var textView: NSTextView!
@IBOutlet var objectController: NSObjectController! {
didSet {
representedObject = dummy
}
}
var dummy : DymmyObject = DymmyObject()
override func viewDidLoad() {
super.viewDidLoad()
self.textView.insertText("123", replacementRange: NSMakeRange(0, 0))
}
}
深入挖掘 - 注意到崩溃时的后台线程是拼写检查器
将最低 macOS 部署目标从 10.13 提高到 10.14 解决了崩溃/问题。