首页 > 解决方案 > 使用 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"];

谢谢你。

标签: objective-cuitableviewnsmutablearraynsuserdefaults

解决方案


一些想法:

  1. 您确实应该将日期保存在NSMutableArrayasNSDate对象中。然后你可以简单地对数组进行排序,如:

    [array sortUsingComparator:^NSComparisonResult(NSDate * _Nonnull obj1, NSDate * _Nonnull obj2) {
        return [obj1 compare:obj2];
    }];
    

    或者

    NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES];
    [array sortUsingDescriptors:@[descriptor]];
    
  2. 如果你坚持存储日期字符串(你真的不应该这样做,因为字符串应该在演示期间格式化,而不是在存储期间),你将不得不获取你的NSString对象数组,将它们转换回NSDate对象数组,对结果数组进行排序,然后使用格式化程序(见下文)NSDate在 UI 中显示这些排序的对象。

  3. 当您在 UI 中显示日期时,您可以使用格式化程序。但是您不需要设置日历、时区或语言环境,因为所有这些都已经默认为用户的当前设置。而且我当然不会用公历覆盖用户的日历(因为这对于将设备配置为使用公历的用户来说非常烦人)。

    此外,我们通常应该避免指定日期格式字符串。最好使用日期/时间样式,例如:

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.dateStyle = NSDateFormatterLongStyle;
    formatter.timeStyle = NSDateFormatterShortStyle;
    

    这样,美国用户将看到:

    2020 年 6 月 7 日下午 5:10

    而德国用户将看到:

    1. 2020年6月 嗯 17:10

    我们应该始终在用户的首选语言环境/日历中显示日期。


推荐阅读