苹果开发论坛上有一个有趣的讨论,关于为大行集手动计算表视图部分。要查看它,需要开发者帐户:
NSFetchedResultsController 正在获取数据库中的所有对象...
为了让那些没有开发帐户的人重新考虑,Apple 技术人员建议使用包含索引标题的实体,与要在行中显示的实体具有一对多关系。
典型的例子是歌曲或艺术家的集合,其中索引部分标题是第一个字母 A,B,C...
因此,标题为 A 的实体将与以字母 A 开头的歌曲存在一对多关系,依此类推。
该机制是使用获取结果控制器来检索所有歌曲,同时发起获取请求以检索 NSArray 索引。
NSFetchRequest *req = //fetch request for section entity
NSArray *sections = [MOC executeFetchRequest:req error:&error];
获取节数和节中的行非常容易:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
NSInteger abc = [self.sections count];
return abc;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
CardSection *s = (CardSection*)[self.sections objectAtIndex:section];
NSInteger rows = [s.cards count];
return rows;
}
-(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
CardSection *s = [self.sections objectAtIndex:section];
NSString *title = s.title;
return title;
}
但是,问题从索引路径处的行单元格开始:
- (UITableViewCell *)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSManagedObject obj = [_fetchedResultsController objectAtIndexPath:indexPath];
// build cell....
return cell;
}
因为显然索引路径是指计算的部分和行,因此获取的控制器超出了范围。
当然,这可以通过调用部分实体并在 NSSet 关系中请求特定的索引对象来解决,但是这样就失去了获取控制器的好处。
我想知道是否有人尝试过这种方法,他是如何解决这个问题的。