2016-12-15 8 views
0

Мне трудно получить NSView, чтобы наблюдать за изменениями его родителя NSWindow. Я пробовал это на тестовом проекте с не более чем NSWindow, который содержит подкласс MyView от NSView, просто чтобы узнать, не хватает ли я чего-то.NSView не может наблюдать изменения NSWindow - KVO и Swift

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, но не повезло. Я также проверил другие ответы и не смог найти ответ. Большинство обложек делают ваш собственный класс KVO совместимым. Я хочу наблюдать объект NSWindow. Что мне не хватает?

ответ

0

Похоже, что 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!") 
    } 
} 
Смежные вопросы