Переопределение упорядоченных объектов 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 или в коде.