2017-03-21 9 views
0

私のプロジェクトではNSTreeControllerNSOutlineView(ココアバインディング)にバインドされています。何らかの理由でNSPredicateを使用してコアデータからデータをフィルタリングすることはできません。そこで、arrangedObjectsNSTreeControllerに上書きしようとしましたが、オーバーライドarrangedObjectsはまだ解雇されていません。 (私はその中にデバッグブレークポイントを設定します。)コードはコンパイルされており、私はすでにCleanTreeControllerにインスタンスを変更しました。メーリングリストにはan unanswered question asked a decade agoしか見つかりませんでした。NSTreeControllerの配置済みオブジェクトをオーバーライド

// Subclass of NSTreeController 
class CleanTreeController: NSTreeController { 
    init() { 
     // This gets called. 
     super.init(content: nil) 
    } 

    required init?(coder: NSCoder) { 
     super.init(coder: coder) 
    } 

    override var arrangedObjects: Any { 
     let oldArranged = super.arrangedObjects 

     let selector = NSSelectorFromString("childNodes") 

     guard let oldChildren = (oldArranged as! NSObject) 
          .perform(selector).takeUnretainedValue() as? [NSTreeNode] 
     else 
     { 
      return oldArranged 
     } 

     let children = oldChildren.filter { (treeNode) in 
      //... do some filtering 
     } 

     return TreeNodeProxy(with: children) 
    } 
} 

// Homemade NSTreeNodeProxy 
class TreeNodeProxy : NSObject { 

    fileprivate var rootNode : NSTreeNode 

    init(with children : [NSTreeNode]) { 
     self.rootNode = NSTreeNode() 
     self.rootNode.mutableChildren.addObjects(from: children) 
    } 

    @objc(childNodes) 
    var children: [NSTreeNode]? { 
     return rootNode.children 
    } 

    @objc(descendantNodeAtIndexPath:) 
    func descendant(at indexPath: IndexPath) -> NSTreeNode? { 
     return rootNode.descendant(at: indexPath) 
    } 
} 

NSTreeControllerのarrangedObjectsメソッドによって返さ

値が 不透明である私を見つけました。 の変更が発生したことを確認するには、このプロパティーを監視する必要があります。

docである。だから、NSOutineViewは(直接)それを読むことなくarrangedObjectsを消費することができますか?

+1

私はこれを試して、 'arrangedObjects'を呼び出しました。おそらく 'content'セッターをオーバーライドする方が簡単でしょうか? – Willeke

+0

ありがとうございます。デバッグ用のイニシャライザをオーバーライドしただけで、そのうちの1つが呼び出されます。これは奇妙です。 – LShi

+0

私はテストのためのバニラプロジェクトを作った、それは同じです: 'arranObjects'ゲッターは、アプリケーションの起動時に呼び出されません。 (私はxibではなくプログラムでバインドしていましたが、違いはありません)しかし、私は表示されたオブジェクトを削除した後、arrangedObjectsが起動したことがわかりました。私はそれを見て、何が違いを生み出したのか見てみましょう。 – LShi

答えて

0

NSTreeControllerfetchPredicateをxibまたはコードに設定します。

+0

ありがとうございます。ただし、fetchPredicateは計算されたプロパティまたは一時的な属性を使用できません。 – LShi

関連する問題