2012-01-19 59 views
4

如何索引NSFetchedResultsController以便我可以在tableview上實現A-Z索引。已編入索引的NSFetchedResultsController

我在初始化程序中看到我可以做sectionNameKeyPath但這只是將獨特的對象放置在它們自己的部分中。

這裏是我有我的NSFetchedResultsController

- (NSFetchedResultsController *)fetchedResultsController 
{ 
    if (__fetchedResultsController != nil) { 
     return __fetchedResultsController; 
    } 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Customer" inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    [fetchRequest setFetchBatchSize:20]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 
    NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil]; 

    [fetchRequest setSortDescriptors:sortDescriptors]; 

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"name" cacheName:@"Customer"]; 
    aFetchedResultsController.delegate = self; 

    self.fetchedResultsController = aFetchedResultsController; 

    return __fetchedResultsController; 
} 

回答

13

實現sectionIndexTitlesForTableView:這樣的:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { 
    return [self.fetchedResultsController sectionIndexTitles]; 
} 

這會給你上的tableView右側的索引。

如果您希望您的部分具有像A,B,C,D等名稱,則必須實施一種方法,該方法會返回對象的第一個字母。

是這樣的:

- (NSString *)firstLetter { 
    [self willAccessValueForKey:@"firstLetter"]; 
    NSString *firstLetter = [[[self name] substringToIndex:1] uppercaseString]; 
    [self didAccessValueForKey:@"firstLetter"]; 
    return firstLetter; 
} 

這對進入自己coredata實體的自定義子類。

然後添加一個名爲firstLetter到你的核心數據實體的瞬時屬性,如果你想有一側的字母AZ(即使你沒有部分與firstLetter

+0

這個工作完美!吹我的腦海。現在,它只在我的數據庫中的對象索引中顯示字母。所以如果我在那裏只有「測試,測試,測試」,它只顯示T,我該如何顯示所有字母以及如何處理帶有「#」的數字?我是否可以放置與其他解決方案類似的字母數組? – tofortier

+1

在我的firstLetter方法中以這種方式找出數字事物。 if([[[[NSNumberFormatter alloc] init] numberFromString:firstLetter]){ return @「#」; } – tofortier

+0

吹我的腦海!真棒感謝 –

0

更換sectionNameKeyPath在NSFetchedResultsController INIT對於每一個字母),這將做到這一點:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { 
    return [NSArray arrayWithObjects:@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z",@"#",nil]; 
} 

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index 
{ 
    index = 0; 
    for(id sectionInfo in [_fetchedResultsController sections]){ 
    if ([[[sectionInfo name] uppercaseString] isEqualToString:title]){ 
     break; 
    } 
    index++; 
    } 
    if (index>=[_fetchedResultsController sections].count){ 
    return -1; 
    } 

    return [_fetchedResultsController sectionForSectionIndexTitle:title atIndex:index]; 
} 
1

@Harris的回答將顯示在表的一側全字母。不幸的是,如果你再輕按實際上有一個相應部分的一個字母,你喜歡的東西崩潰:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'Index title at 3 is not equal to 'K'' 
0

正確的版本(IOS 7.1至8.3):

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { 
    return [NSArray arrayWithObjects:@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z",@"#",nil]; 
} 

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index 
{ 
    NSInteger section = 0; 
    for (id <NSFetchedResultsSectionInfo> sectionInfo in [_fetchedResultsController sections]) 
    { 
     if ([sectionInfo.indexTitle compare:title] >= 0) 
     { 
      break; 
     } 
     section++; 
    } 
    return section; 
} 
相關問題