我使用NSFetchedResultsController为我的UITableView显示了一堆存储在核心数据中的事件。
我要做的是按相对日期(即今天,明天,本周等)对表格进行分组。每个事件都有一个开始日期,我尝试在名为sectionIdentifier的事件实体中创建一个瞬态属性,它将日期转换为如上所述的相对日期,如下所示:
- (NSString*)sectionIdentifier
{
[self willAccessValueForKey:@"sectionIdentifier"];
NSString *tmp = [self primitiveSectionIdentifier];
[self didAccessValueForKey:@"sectionIdentifier"];
if (!tmp)
{
tmp = [Utility formattedDateRelativeToNow:self.startTime];
[self setPrimitiveSectionIdentifier:tmp];
}
return tmp;
}
问题是,它显然只会执行一次,并且不会更新自己,除非更改日期,我真的没想到。我曾想过重写getStartDate访问器来更新sectionIdentifier,虽然这看起来有点沉重和低效,因为它会在每次访问该属性时执行此更新
有什么想法吗?
答案 0 :(得分:4)
这样做的最佳方法是违反直觉的。您可以使用类别扩展NSDate,而不是更改获取的结果控制器或Core Data中的任何内容,以获得基于适当的日期计算返回值的键名/方法。然后,在获取的结果控制器sectionNameKeyPath
中包含keyname /方法。
有关how to extend NSDate with keyname/methods like today, yesterday, tomorrow etc.
的示例,请参阅此前一个答案要使用它,您只需将方法转换为获取结果控制器提取的实体的日期属性,如下所示:
NSFetchedResultsController *frc=[[NSFetchedResultsController alloc] initWithFetchRequest:aFetch
managedObjectContext:aMoc
sectionNameKeyPath:@"startdate.yesterday"
cacheName:nil];
...并且这些部分会自动显示。
答案 1 :(得分:1)
我认为你需要像你显示一个部分的最小持续时间(似乎是一天)那样频繁地更新部分标题。我会按照以下方式进行 -
1)使用applicationDidFinishLaunching
等保存当前时间戳NSUserDefaults
2)下次启动应用程序时,确定当前时间戳和之间的差异。一个人救了。
3)如果差异大于您的最小持续时间(一天),请重新生成您的表格,包括章节标题,因为今天将成为昨天&昨天可能已经成为上周。
HTH,
阿克沙伊