cocoa - 如何使用 sortDescriptors 在 Swift 中对 NSTableView 进行排序?

标签 cocoa sorting swift nstableview

我在用 Swift 编写的 Cocoa 应用程序中使用基于 View 的 NSTableView,并希望在两个表列上实现排序功能。但是,在 Objective-C 中,您可以通过先在 Attribute Inspector 中设置“Sort Key”来实现它,然后实现名为 tableView: sortDescriptorsDidChange: 的数据源委托(delegate)方法。

但是,此方法将 sortDescriptor 作为参数并允许开发人员在方法中使用它,如下所示:

- (void) tableView:( NSTableView *) tableView sortDescriptorsDidChange:( NSArray *) oldDescriptors { 
    [self.songs sortUsingDescriptors:tableView.sortDescriptors]; 
    [tableView reloadData]; 
}

但是,在 Swift Array 中,没有 sortUsingDescriptors 这样的方法。所以我首先尝试将 Array 转换为 NSMutableArray 以便使用 NSMutableArray 的方法,但是由于我的 Swift Array 被定义为 AnyObject[],它不能转换为 NSMutableArray

那么我应该如何在 Swift 中实现 TableView 的排序功能呢?我知道 Swift Array 可以使用 sort 函数通过比较两个参数并返回 bool 值来对对象进行排序,但是是否可以使用 sortDescriptors 对表进行排序?或者我应该忽略 sortDescriptors 参数,而是手动编写我自己的排序逻辑? (但是如果没有 sortDescriptors 值,我不知道如何判断点击了哪一列)。

最佳答案

至少现在最好的方法可能是首先将它转换为 NSMutableArray,然后使用 NSMutableArraysortUsingDescriptors 对其进行排序方法,最后将其转换回原始数组,如下所示:

func tableView(tableView: NSTableView!, sortDescriptorsDidChange oldDescriptors: [AnyObject]) {
    var songsAsMutableArray = NSMutableArray(array: songs)
    songsAsNSMutableArray.sortUsingDescriptors(tableView.sortDescriptors)
    songs = songsAsNSMutableArray
    tableView.reloadData()
}

顺便说一下,var songsAsMutableArray = songs as NSMutableArray 导致错误:NSArray is not a subtype of NSMutableArray,所以我创建了一个NSMutableArray 实例如上所示。

关于cocoa - 如何使用 sortDescriptors 在 Swift 中对 NSTableView 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24602889/

相关文章:

algorithm - 保序散列函数

python - 从元组列表创建树

javascript - JavaScript 中的对象数组排序

ios - UICollectionView 布局在滚动时表现异常

ios - 无需等待提交即可更新iOS App

ios - 如何让 NSAssert 记录 Xcode4 中的描述?

cocoa - 在 Cocoa 中显示字符串

cocoa - 核心数据的多个版本之间的迁移

objective-c - NSTableView,多个单元格和绑定(bind)

ios - 从 Xcode 11.1 升级到 Xcode 11.2 后,应用程序因 _UITextLayoutView 崩溃