以编程方式对 NSTableView 进行排序

Programmatically sorting NSTableView

我知道如何制作table视图用户点击排序table 但如何以编程方式对其进行排序(不使用 NSArrayController)?文档对此很吝啬。这是我得到的:

private func updateThemeTableView()
{
    _tableViewDataDict = getAssociatedThemesFor(_type);
    _tableView.reloadData();

    let sort = NSSortDescriptor(key: "Theme", ascending: true, selector: "caseInsensitiveCompare:");
    _tableView.sortDescriptors = [sort];
}

但这行不通。

这里使用的密钥是什么?这应该是 table 视图列名称还是列标识符(在 IB 中设置)?

什么时候应用排序? (我想在 _tableViewDataDict 收到数据并 reloadData() 之后,NSTableViewDataSource.viewForTableColumn() 开始工作了?)

排序选择器是否有效,或者我是否必须为此提供一种方法?

设置 table 的排序描述符是不够的。您还需要通过将排序描述符应用到您的数据模型然后重新加载 table 的数据(通过 reloadData())来响应 NSTableViewDelegate 方法 optional func tableView(_ aTableView: NSTableView, sortDescriptorsDidChange oldDescriptors: [AnyObject])。无论您是将排序描述符应用于整个 table(不允许用户单击列 headers)还是应用于单个列(允许用户单击列 headers),都是如此.

如评论中所述,您无法对字典进行排序,因此您需要缓存排序后的数组并让 table 数据源方法引用数组而不是字典。