Переопределение упорядоченных объектов NSTreeController

В моем проекте NSTreeController связан с NSOutlineView(какао связывание). По какой-то причине я не могу использоватьNSPredicate фильтровать данные из Core Data. Поэтому я попытался переопределить arrangedObjects из NSTreeController, но наиважнейшая arrangedObjects даже не был уволен. (Я установил точку отладки внутри него.) Код хорошо компилируется, и я уже изменил экземпляр на мой CleanTreeController, Я нашел только вопрос без ответа, заданный десять лет назад в списке рассылки.

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

я обнаружил

Значение, возвращаемое методом orgObjects NSTreeController, является непрозрачным. Вам следует только соблюдать это свойство, чтобы определить, произошло ли изменение.

в док. Так как можно NSOutineView потреблять arrangedObjects не читая это (напрямую)?

1 ответ

Задавать fetchPredicate из NSTreeController в XIB или в коде.

Другие вопросы по тегам