核心数据sectionNameKeyPath自定义字符串

时间:2011-06-30 19:07:39

标签: iphone core-data attributes

从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";

4 个答案:

答案 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;
}