[NSTableColumn使用核心数据字典排序

问题描述 投票:0回答:1

模型

extension MyEntity {

    @nonobjc public class func fetchRequest() -> NSFetchRequest< MyEntity > {
        return NSFetchRequest< MyEntity >(entityName: "MyEntity")
    }

    @NSManaged public var customFields: NSDictionary?
}

customFields键和值是字符串。

绑定

列是用代码创建的,因为用户可以添加/删除列。

column.bind(NSBindingName.value, to: treeController!, withKeyPath: "arrangedObjects.customFields.\(uniqueID))", options: [.createsSortDescriptor:false])
column.sortDescriptorPrototype = NSSortDescriptor(key: "customFields.\(uniqueID))", ascending: true, selector: #selector(NSString.compare(_:)))

问题

单击列标题时排序将不起作用。值只是字符串,但似乎不这样考虑。知道问题可能在哪里吗?谢谢!

UPDATE

  • NSTreeController处于实体模式
  • 这是一个基于视图的轮廓视图(是否仍在使用基于单元格的视图?)
  • 对于静态列(在IB中定义),排序有效
  • 当我在动态列上排序时,什么也没有发生(没有错误)
  • 我想这些值不被视为字符串,因为它是不使用泛型的NSDictionary

UPDATE 2

在另一个项目上,我成功地做到了。唯一的区别是字典不是,而是MyObject具有类型valueString属性。使用以下代码启用排序:

/* Bind column for sorting */
column.bind(NSBindingName.value, to: resultsArrayController!, withKeyPath: "arrangedObjects.dictionary.\(String(describing: paramDef.objectID)).value", options: nil)

或者这也可以工作:

column.sortDescriptorPrototype = NSSortDescriptor(key: "dictionary.\(String(describing: paramDef.objectID)).value", ascending: true, selector: #selector(NSString.compare(_:)))

我不知道为什么在这种情况下而不是上面的情况。

swift core-data nsdictionary nstablecolumn
1个回答
0
投票

好,这很愚蠢。典型的KVO错字:

key: "customFields.\(uniqueID))"应该:key: "customFields.\(uniqueID)"

有一个额外的括号。我觉得我好笨...现在可以正常使用...

© www.soinside.com 2019 - 2024. All rights reserved.