NSView 无法观察 NSWindow 更改 - KVO 和 Swift
NSView unable to observe NSWindow changes - KVO and Swift
我很难让我的 NSView
观察其父 NSWindow
的变化。我在一个测试项目上尝试了这个,只有一个 NSWindow
,其中包含 NSView
的 MyView
subclass 只是为了看看我是否遗漏了什么。
class MyView: NSView {
//add observer on awake from nib
//works fine
override func awakeFromNib() {
if let win = self.window {
win.addObserver(self, forKeyPath: Notification.Name.NSWindowDidBecomeKey.rawValue, options: .new, context: nil)
}
}
//remove observer on dealloc
//allso works fine
deinit {
if let win = self.window {
win.removeObserver(self, forKeyPath: Notification.Name.NSWindowDidBecomeKey.rawValue)
}
}
//never gets called
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
Swift.print(keyPath ?? "")
Swift.print("worked!")
}
override func draw(_ dirtyRect: NSRect) {
NSColor.blue.set()
NSBezierPath.fill(dirtyRect)
}
}
我也尝试了 here 的建议,但没有成功。我也检查了其他答案,但找不到答案。大多数涵盖使您自己的 class KVO 兼容。我想观察一个 NSWindow 对象。我错过了什么?
所以看起来 NSWindowDidBecomeKey
是一个 Notification
需要发布到默认 NotificationCenter
而不是 window 本身。这是有效的正确代码
class MyView: NSView {
//add observer on awake from nib
//works fine
override func awakeFromNib() {
if let win = self.window {
NotificationCenter.default.addObserver(self, selector: #selector(self.windowIsKey(_:)), name: .NSWindowDidBecomeKey, object: win)
}
}
//remove observer on dealloc
//allso works fine
deinit {
if let win = self.window {
NotificationCenter.default.removeObserver(self, name: .NSWindowDidBecomeKey, object: win)
}
}
//now this method is called and works fine
func windowIsKey(_ notification: Notification) {
Swift.print("worked!")
}
}
我很难让我的 NSView
观察其父 NSWindow
的变化。我在一个测试项目上尝试了这个,只有一个 NSWindow
,其中包含 NSView
的 MyView
subclass 只是为了看看我是否遗漏了什么。
class MyView: NSView {
//add observer on awake from nib
//works fine
override func awakeFromNib() {
if let win = self.window {
win.addObserver(self, forKeyPath: Notification.Name.NSWindowDidBecomeKey.rawValue, options: .new, context: nil)
}
}
//remove observer on dealloc
//allso works fine
deinit {
if let win = self.window {
win.removeObserver(self, forKeyPath: Notification.Name.NSWindowDidBecomeKey.rawValue)
}
}
//never gets called
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
Swift.print(keyPath ?? "")
Swift.print("worked!")
}
override func draw(_ dirtyRect: NSRect) {
NSColor.blue.set()
NSBezierPath.fill(dirtyRect)
}
}
我也尝试了 here 的建议,但没有成功。我也检查了其他答案,但找不到答案。大多数涵盖使您自己的 class KVO 兼容。我想观察一个 NSWindow 对象。我错过了什么?
所以看起来 NSWindowDidBecomeKey
是一个 Notification
需要发布到默认 NotificationCenter
而不是 window 本身。这是有效的正确代码
class MyView: NSView {
//add observer on awake from nib
//works fine
override func awakeFromNib() {
if let win = self.window {
NotificationCenter.default.addObserver(self, selector: #selector(self.windowIsKey(_:)), name: .NSWindowDidBecomeKey, object: win)
}
}
//remove observer on dealloc
//allso works fine
deinit {
if let win = self.window {
NotificationCenter.default.removeObserver(self, name: .NSWindowDidBecomeKey, object: win)
}
}
//now this method is called and works fine
func windowIsKey(_ notification: Notification) {
Swift.print("worked!")
}
}