NSView не может наблюдать изменения NSWindow - KVO и Swift
Мне трудно получить мой NSView
наблюдать изменения в своем родителе NSWindow
, Я попробовал это на тестовом проекте с не более чем NSWindow
который содержит MyView
подкласс NSView
просто чтобы увидеть, что я что-то упускаю.
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)
}
}
Я также попробовал предложения здесь, но не повезло. Я также проверил другие ответы и не смог найти ответ. Большинство покрывают создание собственного класса KVO-совместимости. Я хочу наблюдать объект NSWindow. Что мне не хватает?
1 ответ
Решение
Так выглядит NSWindowDidBecomeKey
это Notification
должен быть опубликован по умолчанию NotificationCenter
а не само окно. Это правильный код, который работает
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!")
}
}