使用Objective-C在表视图中排序NSMutableArray

问题描述 投票:0回答:1

所以我有一个带有表视图的小项目。它的单元格是从另一个将文本/日期保存为用户默认值的视图控制器填充的。

但是,一切正常,我希望按上次保存日期对表格视图进行排序。

如何声明:

.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-c uitableview nsmutablearray nsuserdefaults
1个回答
0
投票

一些想法:

  1. 您确实应该将NSMutableArray中的日期另存为NSDate对象。然后您可以简单地对数组进行排序:

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

    NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES];
    [array sortUsingDescriptors:@[descriptor]];
    
  2. 当您在用户界面中显示日期时,可以使用格式化程序。但是您无需设置日历,时区或语言环境,因为所有这些都已默认为用户当前的设置。而且,我当然不会用公历替换用户的日历(因为这对于将设备配置为not使用公历的用户来说非常烦人。)>

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

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

    这样,美国用户将看到:

    2020年6月7日,下午5:10

    德国用户将会看到:

    1. [Juni 2020 um 17:10

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

© www.soinside.com 2019 - 2024. All rights reserved.