如何在TitleForHeaderInSection上排序日期

时间:2017-07-03 03:59:49

标签: ios objective-c json uitableview sorting

我有以下程序:..-但是,我想在TitleForHeaderInSection中按日期降序排序数据,并且还希望将标题中的日期格式化为

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then 
  begin  
   if RegValueExists(RegistryAccount, 'RegistryPath','RegistryValue') then
   begin
     RegDeleteValue(RegistryAccount, 'RegistryPath','RegistryValue');
   end;
  end;
end;   

以下是代码:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
//    [formatter setDateStyle:NSDateFormatterMediumStyle];
[formatter setDateFormat:@"EEE, d MMM yyyy"];
NSDate *headerDate = (NSDate *)[managedObject valueForKey:@"dateCreated"];
NSString *headerTitle = [formatter stringFromDate:headerDate];

1 个答案:

答案 0 :(得分:0)

基本思想是字典是无序的,因此您需要某种方法以正确的顺序检索它们。我可能会建议构建字典键的排序数组。

// build dictionary of objects, keyed by date

NSMutableDictionary *objectsForDates = ...

// build sorted array of dates in descending order

NSArray *dates = [[objectsForDates allKeys] sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
    return [obj2 compare:obj1];
}];

然后,您可以使用此dates对象来表示表视图的“部分”,然后使用它来知道要返回的字典中的哪个条目:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [self.dates count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [self.objectsForDates[self.dates[section]] count];
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return [self.formatter stringFromDate:self.dates[section]];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    Location *object = self.objectsForDates[self.dates[indexPath.section]][indexPath.row];
    cell.textLabel.text = object.home;
    return cell;
}

注意,我建议您对代码进行一些不相关的更改:

  1. 我建议将自定义对象类型用于JSON的内容。这比简单的NSDictionary提供更强的输入。

    我还要确保类型更自然地输入(例如,id看起来应该是NSInteger; date看起来应该是NSDate 1}})。

    我还会为此自定义类型提供initWithDictionary初始化程序,以简化解析代码。

  2. 构建按日期键入的词典(您的convertSectionTableData)的逻辑可以简化一点。

  3. 用户界面的日期格式化程序不应使用locale的{​​{1}}。您解析JSON的格式化程序应该(或者更确切地说,它应该使用en_US),但是当在UI中呈现格式时,您应该使用用户自己的语言环境。

    用户界面的日期格式化程序也不应使用固定的en_US_POSIX字符串。使用其中一个预先存在的dateFormat,或者如果您必须使用dateStyle,请使用dateFormat构建本地化版本。

  4. 无论如何,把它拉到一起,就会得到类似的东西:

    dateFormatFromTemplate

    @interface Location : NSObject
    @property (nonatomic) NSInteger identifier;
    @property (nonatomic, copy) NSString *home;
    @property (nonatomic, strong) NSDate *date;
    
    - (instancetype)initWithDictionary:(NSDictionary *)dictionary;
    @end
    
    @implementation Location
    
    - (instancetype)initWithDictionary:(NSDictionary *)dictionary {
        self = [super init];
        if (self) {
            self.identifier = [dictionary[@"id"] integerValue];
            self.home = dictionary[@"home"];
            [self setDateFromString:dictionary[@"date"]];
        }
        return self;
    }
    
    - (void)setDateFromString:(NSString *)string {
        static NSDateFormatter *formatter;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            formatter = [[NSDateFormatter alloc] init];
            formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
            formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
            formatter.dateFormat = @"yyyy-MM-dd";
        });
    
        self.date = [formatter dateFromString:string];
    }
    @end