gpt4 book ai didi

macos - 从 NSTableView 中删除排序指示器

转载 作者:行者123 更新时间:2023-12-04 13:23:23 25 4
gpt4 key购买 nike

如何从 NSTableView 中删除排序指示符这允许排序?我正在 Xcode 8.3.x 中工作,并使用 Swift 3 for macOS 进行编程。

我有一个 NSTableView作为 NSViewController 的属性.当用户单击标题单元格时,我已经实现了排序。这一切都按预期工作。

当表第一次加载时,它是未排序的,并且没有可见的排序指示器(这是所需的行为)。单击标题单元格后,数据将正确排序,并且将在标题单元格中添加排序指示符。到目前为止一切都很好。

现在我有一个按钮可以重新加载 未分类 table 。单击该按钮确实成功重新加载数据(未排序),但排序指示符仍然存在(但具有误导性)。我想在按下“加载未排序”按钮时删除排序指示器,因为指示器现在是错误的(列表未排序),但在按下“加载未排序”按钮之前的最后一次排序中仍然可以看到该指示器.

我试过 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()
}
}
}

最佳答案

要从表中删除排序,设置一个变量等于一个空数组 NSSortDescriptors ,然后设置表的 sortDescriptors到空数组并调用 reloadData() .

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

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

关于macos - 从 NSTableView 中删除排序指示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45359093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com