以编程方式对 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 数据源方法引用数组而不是字典。
我知道如何制作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 数据源方法引用数组而不是字典。