我的应用程序类似于日志。我保留了一天发生的事件的证据。基本上,我有一个具有“日期”属性的实体(显示在tableview上)。保存新事件时,使用[NSDate date]存储当前日期。如何组织tableview以便所有事件按日排序并按此显示?任何提示将不胜感激!
答案 0 :(得分:3)
您应该使用sectionNameKeyPath
的{{1}}参数按日期划分结果。
您实际上将要用作sectionNameKeyPath参数的属性设置为如下所示:
NSFetchedResultsController
然后您的数据源委托代码将如下所示:
fetchedResultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext
sectionNameKeyPath:@"date"
cacheName:nil];
编辑:为了按日分组项目,您需要为您的托管对象创建一个瞬态属性 - 实际上是从实际日期派生的日期字符串。
这些像往常一样位于.h / .m的顶部
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [[fetchedResultsController sections] count];
}
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
return [fetchedResultsController sectionIndexTitles];
}
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
return [fetchedResultsController sectionForSectionIndexTitle:title atIndex:index];
}
现在您已经创建了该属性,您希望覆盖其访问者以在请求时实际设置标题。
@property (nonatomic, strong) NSString *sectionTitle;
@synthesize sectionTitle;
请注意,此代码实际上会检查sectionTitle是否已缓存,只是重新使用它而不重新创建它。如果您期望或允许更改过去对象的日期,则还需要更新sectionTitle,如果是这种情况,您还需要覆盖日期本身的mutator,并为其添加一行以清除sectionTitle(以便下次请求标题时,将重新创建)。
-(NSString *)sectionTitle
{
[self willAccessValueForKey:@"date"];
NSString *temp = sectionTitle;
[self didAccessValueForKey:@"date"];
if(!temp)
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"d MMMM yyyy"]; // format your section titles however you want
temp = [formatter stringFromDate:date];
sectionTitle = temp;
}
return temp;
}
最后,您应该将- (void)setDate:(NSDate *)newDate {
// If the date changes, the cached section identifier becomes invalid.
[self willChangeValueForKey:@"date"];
[self setPrimitiveTimeStamp:newDate];
[self didChangeValueForKey:@"date"];
[self setSectionTitle:nil];
}
的{{1}}更改为sectionNameKeyPath
。
Apple有一个sample project你可以看一下,如果你想看到类似的东西。