简体   繁体   English

覆盖NSTreeController的rangedObjects

[英]Overriding arrangedObjects of NSTreeController

In my project an NSTreeController is bound to an NSOutlineView (cocoa binding). 在我的项目中, NSTreeController绑定到NSOutlineView (可可绑定)。 For some reason I can't use NSPredicate to filter data from Core Data. 由于某些原因, 我无法使用NSPredicate从Core Data筛选数据。 So I tried to override arrangedObjects of NSTreeController , but the overriding arrangedObjects has not even been fired . 于是,我就重写arrangedObjectsNSTreeController ,但首要arrangedObjects 甚至还没有被解雇 (I set a debugging breakpoint inside it.) The code compiles well and I've already changed the instance to my CleanTreeController . (我在其中设置了一个调试断点。)代码可以很好地编译,并且已经将实例更改为CleanTreeController I only found an unanswered question asked a decade ago in the mailing list. 我只在十年前在邮件列表中发现了一个未回答的问题

// 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)
    }
}

I've found 我发现了

The value returned by NSTreeController's arrangedObjects method is opaque. NSTreeController的splittedObjects方法返回的值是不透明的。 You should only observe this property to determine that a change has occurred. 您应仅观察此属性来确定已发生更改。

in the doc . 文档中 So how can NSOutineView consume arrangedObjects without reading it (directly)? 那么,怎样才能NSOutineView消耗arrangedObjects没有阅读它(直接)?

设置fetchPredicate的的NSTreeController在厦门国际银行或代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM