如何從允許排序的NSTableView
中刪除排序指示器?我正在使用Xcode 8.3.x和使用Swift 3編寫macOS。從NSTableView中刪除排序指示器
我有一個NSTableView
作爲NSViewController
的財產。當用戶點擊標題單元格時,我已經實施了排序。這一切都按預期工作。
當表格第一次加載時,它是未排序的,並且沒有排序指示器可見(這是期望的行爲)。標題單元格被點擊後,數據將被正確排序,並將排序指示器添加到標題單元格中。到目前爲止,所有的都很好
現在我有一個按鈕來重新加載未排序的表。單擊該按鈕確實可以重新加載數據(未排序),但排序指示符仍然存在(但具有誤導性)。當按下「加載未排序」按鈕時,我想刪除排序指示器,因爲指示器現在是錯誤的(列表未排序),但在按下「加載未排序」按鈕之前,指示器仍然可見。
我試過tableView.setIndicatorImage(newImage, in: column)
試圖設置指標爲零或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()
}
}
}
你實現了'tableView(_:sortDescriptorsDidChange:)'嗎?什麼時候調用loadSortedData? – Willeke
是的,'tableView(_:sortDescriptorsDidChange:)'一直是實現的。我添加了代碼來提問。從'viewWillAppear'和'sortDescriptorsDidChange'調用。 – rgbworld