始终排序NSTableView

时间:2016-10-22 02:30:04

标签: swift macos cocoa nstableview

如何在NSTableView中对列进行排序? 加载我的视图时,数据不会被排序,也会在数据更新时进行排序。现在,只有当我点击标题列时,数据才会排序。

以下是我在单击标题列时对数据进行排序的代码:

在ViewDidLoad中:

let descriptorName = NSSortDescriptor(key: "designation", ascending: true, selector: #selector(NSString.caseInsensitiveCompare(_:)))
tableview.tableColumns[0].sortDescriptorPrototype = descriptorName

委托函数:

func tableView(_ tableView: NSTableView, sortDescriptorsDidChange oldDescriptors: [NSSortDescriptor]) {
    let dataArrayMutable = NSMutableArray(array: self.data)
    dataArrayMutable.sort(using: tableView.sortDescriptors)
    self.data = (dataArrayMutable as NSArray) as! [Article]
    tableview.reloadData()
}

问题已解决:在加载tableView之前,我必须对数据数组中的数据进行排序。这是代码:

data = data.sorted(by: { $0.designation! < $1.designation! })

1 个答案:

答案 0 :(得分:1)

数据源中元素的顺序决定了表视图中元素的顺序。这就是为什么当您的数据源(技术上不是您的委托)被告知排序描述符已经改变时,您所做的就是更改数据源管理的数据的顺序。

因此,您的问题的答案只是从一开始就将数据源的数据保持在所需的顺序。不要只在tableView(_:sortDescriptorsDidChange:)中对其进行排序。从头开始排序。

当然,如果动态添加数据,则需要维护排序顺序。您可以使用index(of:inSortedRange:options:usingComparator:)查找插入新元素的位置以维护排序顺序。或者,您可以在任何地方添加数据,然后再次排序。