【问题标题】:Overriding arrangedObjects of NSTreeController覆盖 NSTreeController 的排列对象
【发布时间】: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项目进行测试,也是一样的:应用启动时不会调用arrangedObjects getter。 (我以编程方式绑定了东西,而不是在 xib 中。我猜它不应该有任何区别。)但是我发现在删除显示的对象后,arrangedObjects 确实被解雇了。我会调查一下,看看有什么不同。
  • 我确实在我的测试应用程序中绑定了 xib 中的所有内容,并且在应用程序启动时不会调用 arrangedObjects。我假设 arrangedObjects 没有被调用,因为没有对象,但它也没有被对象调用。

标签: swift macos cocoa cocoa-bindings nstreecontroller


【解决方案1】:

在 xib 或代码中设置 NSTreeController 的 fetchPredicate。

【讨论】:

  • 谢谢。但是 fetchPredicate 不能使用计算属性或瞬态属性。
猜你喜欢
  • 2019-07-10
  • 1970-01-01
  • 2020-11-07
  • 2018-05-02
  • 2013-02-08
  • 2014-09-21
  • 1970-01-01
  • 2012-07-15
  • 2012-07-28
相关资源
最近更新 更多