2016-12-15 8 views
0

に親の変更を確認するのに苦労していますNSWindow。私は以上のテストプロジェクトでこれを試しました。サブクラス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

だから、NSWindowDidBecomeKeyNotificationがウィンドウ自体ではなくデフォルトの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!") 
    } 
} 
関連する問題