如何从允许排序的NSTableView
中删除排序指示符?我正在使用Xcode 8.3.x并使用Swift 3进行macOS编程。
我有NSTableView
作为NSViewController
的属性。当用户点击Title单元格时,我已经实现了排序。这一切都按预期工作。
首次加载表时,它是未排序的,并且没有可见的排序指示符(这是所需的行为)。单击标题单元格后,数据将正确排序,并且排序指示符将添加到标题单元格中。到目前为止一切都很好。
现在我有一个按钮来重新加载未排序的表。单击该按钮会成功重新加载数据(未排序),但排序指示器仍然存在(但有误导性)。我想在"加载未排序"时删除排序指示符。按下按钮是因为指示符现在错误(列表未排序),但在按下"加载未排序"之前,指示符仍然可以从最后一个类别中看到。按钮。
我尝试tableView.setIndicatorImage(newImage, in: column)
尝试将指标设置为nil或1像素图像,但它什么也没做。
我也试过drawSortIndicator
但没有成功。
为了让表最初加载未分类的数据,我为不存在的列添加了一个排序,在初始加载时,我对该列进行排序。这允许我总是显示一个排序列表 - 未排序实际按列排序"无"。
所以,最终,我想要加载表而不进行排序。我想允许排序,我希望能够以未排序的方式重新加载,从而删除可能存在的任何排序指示符。
class AppInfoViewController: NSViewController {
@IBOutlet weak var tableView: NSTableView!
var dataDict: [AppInfo] = AppInfoManager.sharedInstance.appInfoArray
var sortOrder = AppInfoManager.ColumnOrder.None
var sortAscending = true
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
tableView.delegate = self
tableView.dataSource = self
tableView.target = nil
let descriptor_0 = NSSortDescriptor(key: AppInfoManager.ColumnOrder.Name.rawValue, ascending: true)
let descriptor_1 = NSSortDescriptor(key: AppInfoManager.ColumnOrder.Date.rawValue, ascending: true)
let descriptor_2 = NSSortDescriptor(key: AppInfoManager.ColumnOrder.Size.rawValue, ascending: true)
tableView.tableColumns[0].sortDescriptorPrototype = descriptor_0
tableView.tableColumns[1].sortDescriptorPrototype = descriptor_1
tableView.tableColumns[2].sortDescriptorPrototype = descriptor_2
}
override func viewWillAppear() {
super.viewWillAppear()
loadSortedData()
}
@IBAction func reloadUnsortedData(_ sender: Any) {
dataDict = AppInfoManager.sharedInstance.appInfoArray
sortOrder = AppInfoManager.ColumnOrder.None
sortAscending = false
let column = tableView.tableColumns[0]
//tableView.setIndicatorImage(nil, in: column)
//tableView.headerView?.needsDisplay = true
//tableView.headerView?.display()
column.headerCell.drawSortIndicator(withFrame: column.headerCell.sortIndicatorRect(forBounds: (tableView.headerView?.frame)!), in: column.tableView!, ascending: false, priority: 1)
tableView.reloadData()
}
func loadSortedData() {
dataDict = AppInfoManager.sharedInstance.contentsOrderedBy(sortOrder, ascending: sortAscending)
tableView.reloadData()
}
}
在AppInfoManager类中,排序完成如下:
class AppInfoManager {
static let sharedInstance: AppInfoManager = AppInfoManager()
var appInfoArray:[AppInfo] = [AppInfo]()
public enum ColumnOrder: String {
case None
case Name
case Date
case Size
}
func contentsOrderedBy(_ orderedBy: ColumnOrder, ascending: Bool) -> [AppInfo] {
let sortedFiles: [AppInfo]
switch orderedBy {
case .Name:
if ascending == true {
sortedFiles = appInfoArray.sorted(by: {$0.appTitle < $1.appTitle })
} else {
sortedFiles = appInfoArray.sorted(by: {$0.appTitle > $1.appTitle })
}
case .Date:
if ascending == true {
sortedFiles = appInfoArray.sorted(by: {$0.pid < $1.pid })
} else {
sortedFiles = appInfoArray.sorted(by: {$0.pid > $1.pid })
}
case .Size:
if ascending == true {
sortedFiles = appInfoArray.sorted(by: {$0.executableName < $1.executableName })
} else {
sortedFiles = appInfoArray.sorted(by: {$0.executableName > $1.executableName })
}
case .None:
sortedFiles = appInfoArray
}
return sortedFiles
}
}
在AppInfoViewController(NSTableViewDataSource)
中extension AppInfoViewController: NSTableViewDataSource {
func numberOfRows(in tableView: NSTableView) -> Int {
return dataDict.count
}
func tableView(_ tableView: NSTableView, sortDescriptorsDidChange oldDescriptors: [NSSortDescriptor]) {
guard let sortDescriptor = tableView.sortDescriptors.first else {
return
}
if let order = AppInfoManager.ColumnOrder(rawValue: sortDescriptor.key!) {
sortOrder = order
sortAscending = sortDescriptor.ascending
loadSortedData()
}
}
}
答案 0 :(得分:0)
要从表中删除排序,请将变量设置为等于NSSortDescriptors
的空数组,然后将表的sortDescriptors
设置为空数组并调用reloadData()
。
class AppInfoViewController: NSViewController {
let defaultSortDescriptors = [NSSortDescriptor]()
}
@IBAction func reloadUnsortedData(_ sender: Any) {
tableView.sortDescriptors = defaultSortDescriptors
tableView.reloadData()
}