2017-07-27 49 views
1

如何從允許排序的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() 
     } 
    } 
} 
+0

你實現了'tableView(_:sortDescriptorsDidChange:)'嗎?什麼時候調用loadSortedData? – Willeke

+0

是的,'tableView(_:sortDescriptorsDidChange:)'一直是實現的。我添加了代碼來提問。從'viewWillAppear'和'sortDescriptorsDidChange'調用。 – rgbworld

回答

0

爲了除去從表排序,設置一個變量等於一空數組NSSortDescriptors,然後將該表的sortDescriptors設置爲空數組並調用reloadData()

class AppInfoViewController: NSViewController { 
    let defaultSortDescriptors = [NSSortDescriptor]() 
} 

@IBAction func reloadUnsortedData(_ sender: Any) { 
    tableView.sortDescriptors = defaultSortDescriptors 
    tableView.reloadData() 
}