objective-c - 使用 Objective-C 在 tableview 中对 NSMutableArray 进行排序
问题描述
所以我有一个带有表格视图的小项目。它的单元格是从另一个视图控制器填充的,该控制器将文本/日期保存为用户默认值。
一切正常,但是,我希望按上次保存的日期对表格视图进行排序。
它是如何声明的:
.h
NSMutableArray *dateArray;
.m
self.dateArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"date"];
我怎样才能做到这一点?我已经看到了使用数组和可变的方法来做到这一点,但对于来自 userdefaults 的字符串却没有。
更新/更多信息:这是另一个视图控制器保存日期的方式
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MMMM d, yyyy 'at' h:mm a"];
NSDate *dateNow = [NSDate date];
NSString *dateNowStr = [dateFormatter stringFromDate:dateNow];
NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSTimeZone *timeZone = [NSTimeZone localTimeZone];
NSLocale *locale = [NSLocale currentLocale];
[dateFormatter setCalendar:gregorianCalendar];
[dateFormatter setTimeZone:timeZone];
[dateFormatter setLocale:locale];
NSArray *tempDateArray = [[NSUserDefaults standardUserDefaults]objectForKey:@"date"];
NSMutableArray *mutableDateArray = [tempDateArray mutableCopy];
[mutableDateArray insertObject:dateNowStr atIndex:self.index];
[[NSUserDefaults standardUserDefaults] setObject:mutableDateArray forKey:@"date"];
它通过以下方式加载:
self.dateArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"date"];
谢谢你。
解决方案
一些想法:
您确实应该将日期保存在
NSMutableArray
asNSDate
对象中。然后你可以简单地对数组进行排序,如:[array sortUsingComparator:^NSComparisonResult(NSDate * _Nonnull obj1, NSDate * _Nonnull obj2) { return [obj1 compare:obj2]; }];
或者
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES]; [array sortUsingDescriptors:@[descriptor]];
如果你坚持存储日期字符串(你真的不应该这样做,因为字符串应该在演示期间格式化,而不是在存储期间),你将不得不获取你的
NSString
对象数组,将它们转换回NSDate
对象数组,对结果数组进行排序,然后使用格式化程序(见下文)NSDate
在 UI 中显示这些排序的对象。当您在 UI 中显示日期时,您可以使用格式化程序。但是您不需要设置日历、时区或语言环境,因为所有这些都已经默认为用户的当前设置。而且我当然不会用公历覆盖用户的日历(因为这对于将设备配置为不使用公历的用户来说非常烦人)。
此外,我们通常应该避免指定日期格式字符串。最好使用日期/时间样式,例如:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateStyle = NSDateFormatterLongStyle; formatter.timeStyle = NSDateFormatterShortStyle;
这样,美国用户将看到:
2020 年 6 月 7 日下午 5:10
而德国用户将看到:
- 2020年6月 嗯 17:10
我们应该始终在用户的首选语言环境/日历中显示日期。
推荐阅读
- r - 如何摆脱多面图中的空条形图?
- mysql - 如何在 MySQL 列注释中连接字符串?
- python - Google Cloud Engine - 如何在 Python 3.7 中接收和处理电子邮件?
- java - 如何在 .jar 中包含和访问图像
- c# - 如何更改此动画过渡以自动发生?
- c# - 如何将 List 方法更改为 Array 方法?
- java - Spring Boot - 如何使用 cors 和 spring security 修复 Session bean
- ios - WebRTC iOS 13 问题与 Metal
- java - 如何在 Java 中截断部分字符串?
- amazon-web-services - 需要移动已部署的文件夹 - AWS CodeDeploy