1

テーブルビューを毎月のセクションに分割しようとしています。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;
}

これは私の titleForHeaderSection で行うことです

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

私のrowsInSectionの数については、これを行います。

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

        NSInteger count = [sectionInfo numberOfObjects];
        return count;

そして、これは私の NumberOfSectionsInTableview

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)'
4

1 に答える 1

5

nsmanagedobject の一時的なプロパティをコーディングするときによくある間違いの 1 つは、データ モデル ファイル (xcdatamodeld) で一時的なプロパティを「有効にする」ことを忘れていることです。

于 2013-12-22T02:53:16.797 に答える