【问题标题】:Need to sort section header title by date需要按日期对节标题标题进行排序
【发布时间】:2014-07-03 12:16:42
【问题描述】:

我的 UITableView 中的每个部分标题都是一个日期。我可以很好地设置标题,但是,标题是按字母顺序排序的,而不是按日期排序的。所以,周一高于周六,周六高于周三。有没有办法按日期按时间顺序对标题进行排序?

这是我用来设置节标题的代码,其中entry.sectionName (type = string) 是我的模型实体中的一个属性,也用作我的 sectionNameKeyPath。

//set sectionName
NSDate *headerDate = [NSDate date];
NSDateFormatter *headerDateFormatter = [[NSDateFormatter alloc] init];
[headerDateFormatter setDateFormat:@"EEEE MMMM d, yyyy"];
NSString *headerDateString = [headerDateFormatter stringFromDate:headerDate];
entry.sectionName = headerDateString;

我假设 sectionName 属性需要是日期而不是字符串?这是正确的,如果是这样,代码是什么样的?我正在使用下面的代码将其改回 NSDate,但它似乎不起作用或显示任何数据。

//set sectionName
NSDate *headerDate = [NSDate date];
NSDateFormatter *headerDateFormatter = [[NSDateFormatter alloc] init];
[headerDateFormatter setDateFormat:@"EEEE MMMM d, yyyy"];
NSString *headerDateString = [headerDateFormatter stringFromDate:headerDate];

NSDateFormatter *inFormat = [[NSDateFormatter alloc] init];
[inFormat setDateFormat:@"MMM dd, yyyy"];

NSDate *parsed = [inFormat dateFromString:headerDateString];

entry.sectionName = parsed;

下面是获取结果控制器

-(NSFetchRequest *)entryListFetchRequest{
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"BreastEntry"];
[fetchRequest setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"sectionName" ascending:YES],
                                   [NSSortDescriptor sortDescriptorWithKey:@"timePicker" ascending:NO]]];


return fetchRequest;
}



-(NSFetchedResultsController *)fetchedResultsController{
if(_fetchedResultsController != nil){
    return _fetchedResultsController;
}

CoreDataStack *coreDataStack =[CoreDataStack defaultStack];
NSFetchRequest *fetchRequest = [self entryListFetchRequest];

_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:coreDataStack.managedObjectContext sectionNameKeyPath:@"sectionName" cacheName:nil];
_fetchedResultsController.delegate = self;

return _fetchedResultsController;

}

titleForSectionInHeader 方法

-(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{

id<NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController sections][section];
return [sectionInfo name];

}

【问题讨论】:

  • 在 UITableView 中使用数据之前,您的数据通常应该按照正确的顺序排列。您能否在对“条目”对象进行排序时添加代码?
  • @AlexVogel 查看 FRC 的更新问题

标签: ios uitableview nsdate


【解决方案1】:

如果我正确理解了您的代码,您将在将它们保存到 CoreData 之前创建部分名称。您正在以"EEEE MMMM d, yyyy" 的格式创建部分名称,其中将日期名称作为第一项。对这些数据进行排序确实为您提供了星期一在星期六之前的排序(M "yyyy-MM-dd")。所以代码以年第一、月第二、日作为第三个参数对日期进行排序。

在为 UITableView 中的标题创建文本时,您现在可以按照您希望的任何其他方式格式化日期信息(使用 NSDateFormatter 首先创建一个 NSDate 对象,而不是您请求的文本格式)。

注意:这是一个“我不能 100% 确定它会起作用”的答案,但我会这样做。

【讨论】:

  • 这听起来像是一种合乎逻辑/合理的方法。我想,我理解第一部分。那么您是建议我的 sectionName(attribute) 应该采用 NSString 或 NSDate 的形式吗?至于您的第二段,您是否建议在 titleForHeaderInSectionMethod 中格式化日期?如果是这样,这会是什么样子? (我在上面添加了我的titleForHeaderInSectionMethod,更新了代码)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 2016-08-23
  • 1970-01-01
相关资源
最近更新 更多