如何按字母顺序对表格视图单元格进行排序

Posted

技术标签:

【中文标题】如何按字母顺序对表格视图单元格进行排序【英文标题】:how to sort a tableview cell alphabetically 【发布时间】:2018-01-16 07:19:12 【问题描述】:

我有一个由数组填充的日期视图单元格,我需要添加两个按钮,一个用于 A 到 Z,另一个用于 Z 到 A。我能够对数组进行排序,但不确定如何在运行时更改它我的意思是在表格视图中按下按钮。这是我用来排序的代码:

[filePathsArray sortUsingSelector:@selector(compare:)];

表格视图只是常规的表格视图,使用 csv 文件中的数组归档。这就是我获取数组的方式 路径 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSFileManager *manager = [NSFileManager defaultManager];
NSMutableArray*   fileList = [manager contentsOfDirectoryAtPath:documentsDirectory error:nil];
//--- Listing file by name sort
NSLog(@"\n File list %@",fileList);

//---- Sorting files by extension
NSMutableArray *filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory error:nil];

[filePathsArray sortUsingSelector:@selector(compare:)];
NSLog(@"\n sort by");

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF EndsWith '.csv'"];
filePathsArray =  [filePathsArray filteredArrayUsingPredicate:predicate];
NSLog(@"\n\n Sorted files by extension %@",filePathsArray);

任何帮助或指导将不胜感激。 谢谢。

【问题讨论】:

假设您的数据源已正确完成,只需重新加载需要更新的单元格。 UITableView 有一个 .reloadData() 来重新加载整个表格,如果只有特定的单元格受到影响,您可以改为使用 .reloadRows(at:with:) 提供要重新加载的单元格的 indexPath 和枚举 UITableViewRowAnimation 的一个选项来选择重新加载这些行的视觉效果。 【参考方案1】:

使用sortUsingComparator而不是sortUsingSelector来实现不同的排序方向:

[filePathsArray sortUsingComparator:^NSComparisonResult(NSString* fp1, NSString* fp2) 
  return [fp1 compare:fp2];
];

要恢复排序方向,只需将参数交换为compare

[filePathsArray sortUsingComparator:^NSComparisonResult(NSString* fp1, NSString* fp2) 
  return [fp2 compare:fp1];
];

然后您的A-ZZ-A 按钮可以使用其中一种方法简单地排序并调用[tableView reloadData]

【讨论】:

嗨!我使用上面的代码,但是我在控制台中得到的代码却崩溃了:-[__NSArrayI sortUsingComparator:]: unrecognized selector sent to instance 0x1c4649330 2018-01-16 16:12:03.305146-0700 oFiosstoryboard[31492:4290430] ** * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSArrayI sortUsingComparator:]:无法识别的选择器发送到实例 0x1c4649330” 啊,这很可能是因为subpathsOfDirectoryAtPath 返回了一个不可变数组。将分配给filePathsArray 更改为:NSMutableArray *filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory error:nil].mutableCopy; (即,附加 .mutableCopy)

以上是关于如何按字母顺序对表格视图单元格进行排序的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSFetchRequest 按日期和单元格按时区字母顺序对部分进行排序

NSSortDescriptor 在查看详细视图并返回后按字母顺序重新排序单元格

按创建排序表格视图单元格(swift)

如何组织表格视图单元格

重新排序单元格后如何更改获取结果控制器数组中对象的顺序

在表格视图中重新排序按日期排序的单元格项目