你能帮我看看如何在NSArrayController
使用Smart KeyPaths修改内容时收到通知吗?
灵感来自
键值观察:https: //developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html#//apple_ref/doc/uid/TP40014216-CH7-ID12
Smart KeyPaths:为Swift提供更好的键值编码:https: //github.com/apple/swift-evolution/blob/master/proposals/0161-key-paths.md
我模仿了文章的示例代码.
class myArrayController: NSArrayController {
required init?(coder: NSCoder) {
super.init(coder: coder)
observe(\.content, options: [.new]) { object, change in
print("Observed a change to \(object.content.debugDescription)")
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这是行不通的.对目标对象所做的任何更改都不会触发通知.
相比之下,下面列出的典型方法是有效的.
class myArrayController: NSArrayController {
required init?(coder: NSCoder) {
super.init(coder: coder)
addObserver(self, forKeyPath: "content", options: .new, context: nil)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if …
Run Code Online (Sandbox Code Playgroud) 您能否简要解释@objc
和dynamic
使用Xcode中的9.x斯威夫特4是什么意思?
通过尝试和错误以及stackoverflow中的后续文章,我终于实现了此代码片段的工作。但我想对这些神奇的关键字有所了解。
class SampleViewController: NSViewController {
@objc class Parameters : NSObject {
@objc dynamic var value1: Double = 0 // bound to Value of a NSTextfield with NumberFormatter
@objc dynamic var value2: Double = 0 // as "parameters.value1" for the Model Key Path
}
@objc dynamic var parameters = Parameters()
@objc dynamic var value3: Double { // in the similar way as "value3" for the Model Key Path
get {
return parameters.value1 + parameters.value2
}
} …
Run Code Online (Sandbox Code Playgroud)