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!")
    }
} 
Другие вопросы по тегам