使用每个月使用 NSFetchedResult 控制器和节标题



可能的重复项:
使用获取结果控制器为每个月设置不同的部分

我正在尝试将我的 UITableview 拆分为每个月的部分。我开始使用Apple的DateSectionTitles示例。首先,我在核心数据中添加了一个属性"sectionIdentifier"。 然后在我的托管对象子类中,我添加了此方法。

- (NSString *)sectionIdentifier {
    // Create and cache the section identifier on demand.
    [self willAccessValueForKey:@"sectionIdentifier"];
    NSString *tmp = [self primitiveSectionIdentifier];
    [self didAccessValueForKey:@"sectionIdentifier"];
    if (!tmp) {
        /*
         Sections are organized by month and year. Create the section identifier as a string representing the number (year * 1000) + month; this way they will be correctly ordered chronologically regardless of the actual name of the month.
         */
        NSCalendar *calendar = [NSCalendar currentCalendar];
        NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit) fromDate:[self date]];
        tmp = [NSString stringWithFormat:@"%d", ([components year] * 1000) + [components month]];
          [self setPrimitiveSectionIdentifier:tmp];
    }
    NSLog(@"tmp: %@",tmp);
    return tmp;
}

这就是我在标题中所做的标题部分

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
        id <NSFetchedResultsSectionInfo> theSection = [[self.fetchedResultsController sections] objectAtIndex:section];

    /*
     Section information derives from an event's sectionIdentifier, which is a string representing the number (year * 1000) + month.
     To display the section title, convert the year and month components to a string representation.
     */
    static NSArray *monthSymbols = nil;
    if (!monthSymbols) {
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setCalendar:[NSCalendar currentCalendar]];
        monthSymbols = [formatter monthSymbols];
    }
    NSInteger numericSection = [[theSection name] integerValue];
    NSInteger year = numericSection / 1000;
    NSInteger month = numericSection - (year * 1000);
    NSString *titleString = [NSString stringWithFormat:@"%@ %d", [monthSymbols objectAtIndex:month-1], year];
    NSLog(@"titelstring is: %@",titleString);
    return titleString;
}

对于我的行数,我这样做。

id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
        NSInteger count = [sectionInfo numberOfObjects];
        return count;

这为我的 节数在表视图中

NSInteger count = [[self.fetchedResultsController sections] count];
        return count;

有人可以帮忙吗?

提前感谢!

出了什么问题

首先,它不会在 NSLog(@"tmp: %@",tmp) 中打印我的日志;而且我还收到以下错误:

**CoreData**: error: (NSFetchedResultsController) A section returned nil value for section name key path 'sectionIdentifier'. Objects will be placed in unnamed section
2012-10-10 10:41:17.475 RacingGenk[15785:c07] *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFArray objectAtIndex:]: index (-1 (or possibly larger)) beyond bounds (12)'

编辑这是我设置NSFetchresultcontroller的地方

- (void)getKalender // attaches an NSFetchRequest to this UITableViewController
{
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Kalender"];
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:YES]];
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                        managedObjectContext:self.genkDatabase.managedObjectContext
                                                                sectionNameKeyPath:@"Kalender.sectionIdentifier" cacheName:@"Root"];
    self.fetchedResultsController.delegate = self;
    self.fetchedResultsController = self.fetchedResultsController;

我认为一定是

sectionNameKeyPath:@"sectionIdentifier"

而不是

sectionNameKeyPath:@"Kalender.sectionIdentifier"

在构建获取的结果控制器时。

相关内容

最新更新