0

我的应用程序类似于日志。我保留了一天内发生的事件的证据。基本上,我有一个带有“日期”属性的实体(显示在表格视图上)。当我保存一个新事件时,使用 [NSDate date] 存储当前日期。如何组织表格视图,以便所有事件按天排序并显示?任何提示将不胜感激!

4

1 回答 1

3

您应该使用您的sectionNameKeyPath参数NSFetchedResultsController按日期划分结果。

这里这里的例子很少。

您基本上将要用作 sectionNameKeyPath 参数的属性设置为如下所示:

fetchedResultsController = [[NSFetchedResultsController alloc]
                            initWithFetchRequest:fetchRequest
                            managedObjectContext:managedObjectContext
                              sectionNameKeyPath:@"date"
                                       cacheName:nil];

然后您的数据源委托代码将如下所示:

- (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];
}

编辑:为了仅按天对项目进行分组,您需要为托管对象创建一个临时属性 - 本质上是一个从实际日期派生的日期字符串。

这些像往常一样位于您的 .h / .m 的顶部

@property (nonatomic, strong) NSString *sectionTitle;

@synthesize 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;
}

请注意,此代码实际上检查 sectionTitle 是否已被缓存,并且只是重新使用它而不重新创建它。如果您期望或允许更改过去对象的日期,则 sectionTitle 也需要更新,如果是这种情况,您还需要覆盖日期本身的 mutator,并添加一行以清除sectionTitle(以便下次请求标题时,将重新创建它)。

- (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];
}

最后,您应该将sectionNameKeyPathfor your fetchedResultsControllerto更改为@"sectionTitle".

Apple 有一个示例项目,如果您想看到类似的操作,您可以查看。

于 2012-06-25T18:57:38.630 回答