私のプロジェクトではNSTreeController
はNSOutlineView
(ココアバインディング)にバインドされています。何らかの理由でNSPredicate
を使用してコアデータからデータをフィルタリングすることはできません。そこで、arrangedObjects
をNSTreeController
に上書きしようとしましたが、オーバーライド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
を消費することができますか?
私はこれを試して、 'arrangedObjects'を呼び出しました。おそらく 'content'セッターをオーバーライドする方が簡単でしょうか? – Willeke
ありがとうございます。デバッグ用のイニシャライザをオーバーライドしただけで、そのうちの1つが呼び出されます。これは奇妙です。 – LShi
私はテストのためのバニラプロジェクトを作った、それは同じです: 'arranObjects'ゲッターは、アプリケーションの起動時に呼び出されません。 (私はxibではなくプログラムでバインドしていましたが、違いはありません)しかし、私は表示されたオブジェクトを削除した後、arrangedObjectsが起動したことがわかりました。私はそれを見て、何が違いを生み出したのか見てみましょう。 – LShi