【发布时间】:2017-03-21 06:33:07
【问题描述】:
在我的项目中,NSTreeController 绑定到 NSOutlineView(可可绑定)。出于某种原因我不能使用NSPredicate 来过滤来自Core Data 的数据。所以我尝试覆盖arrangedObjects 的NSTreeController,但覆盖arrangedObjects 甚至没有被解雇。 (我在其中设置了一个调试断点。)代码编译良好,我已经将实例更改为我的CleanTreeController。我只在邮件列表中找到了an unanswered question asked a decade ago。
// 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的arrangeObjects方法返回的值为 不透明。你应该只观察这个属性来确定一个 发生了变化。
在doc。那么NSOutineView如何在不阅读(直接)的情况下消费arrangedObjects呢?
【问题讨论】:
-
我试过这个并调用了
arrangedObjects。也许覆盖content设置器更容易? -
谢谢。只是重写了用于调试的初始化程序,其中一个被调用。这很奇怪。
-
我做了一个vanilla项目进行测试,也是一样的:应用启动时不会调用
arrangedObjectsgetter。 (我以编程方式绑定了东西,而不是在 xib 中。我猜它不应该有任何区别。)但是我发现在删除显示的对象后,arrangedObjects 确实被解雇了。我会调查一下,看看有什么不同。 -
我确实在我的测试应用程序中绑定了 xib 中的所有内容,并且在应用程序启动时不会调用
arrangedObjects。我假设arrangedObjects没有被调用,因为没有对象,但它也没有被对象调用。
标签: swift macos cocoa cocoa-bindings nstreecontroller