从Core Data中排序对象表时,我想为包含属性的节标题设置自定义字符串。例如,我希望节名称显示“4 Stars”,而不仅仅是4.我已经摆弄它了,但是如果我尝试将sectionNameKeyPath的字符串设置为除了一个以外的任何东西,它似乎变得脾气暴躁实体属性,只有实体属性。这里仅适用于属性,并且有几次尝试自定义断开的字符串之一已被注释掉。
NSSortDescriptor *ratingDescriptor = [[NSSortDescriptor alloc] initWithKey:@"starRating" ascending:NO];
sortDescriptors = [NSArray arrayWithObjects:ratingDescriptor, nameDescriptor, nil];
[ratingDescriptor release], ratingDescriptor = nil;
// NSString *starSectionHeading = [NSString stringWithFormat:@"%d Stars", @"starRating"];
// sectionKeyPath = starSectionHeading;
sectionKeyPath = @"starRating";
答案 0 :(得分:1)
sectionNameKeyPath
应该是一个关键路径,即单个属性的名称或终止于单个属性的关系的名称。您正在尝试创建两个属性的组合,并且FRC不会自动支持该属性。
为了获得更多花哨的东西,你必须继承NSFetchedResultsController。 From the docs.
如果是,则创建此类的子类 你想自定义创建 部分和索引标题。您 覆盖 sectionIndexTitleForSectionName:if 你想要节索引标题 资本化以外的东西 部分名称的第一个字母。您 如果你,覆盖sectionIndexTitles 希望索引标题是什么 除了由...创建的数组 调用 sectionIndexTitleForSectionName:on 所有已知部分。
答案 1 :(得分:1)
将sectionNameKeyPath设置为“starRating”,但随后在表视图中修改输出。 FRC将对您需要更改通常显示为标题字符串的部分进行排序和整理。
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
// Display the stars as section headings.
int stars = [[[[fetchedResultsController sections] objectAtIndex:section] valueForKey:@"name"] intValue];
if(stars == 1)
{
return @"1 Star"
}
else
{
return [NSString stringWithFormat:@"%u Stars", stars];
}
}
我在一些表视图中执行此操作,其中输出格式以通用方式处理(在给定第一个排序描述符路径和标题值的情况下,我将标题标题委托给另一个控制器类)。因此,您不仅限于对表视图委托方法进行硬编码,如上面的代码。
你也有机会在这里本地化字符串,我必须在我的应用程序中处理15个本地化,你必须在本地化时考虑一些事情。
答案 2 :(得分:0)
通过创建瞬态属性来查看此答案: NSFetchedResultsController with sections created by first letter of a string
只需更改一些名称,并在您的版本的committeeNameInitial中替换:
[[self committeeName] substringToIndex:1];
与
[NSString stringWithFormat:@"%@ Stars", [self starRating]];
答案 3 :(得分:0)
(NSString *)tableView:(UITableView *)aTableView titleForHeaderInSection:(NSInteger)section
{
if ([self.fetchedResultsController sections].count > 0) {
id <NSFetchedResultsSectionInfo> sectionInfo =
[[self.fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo name];
}
return nil;
}