Индексированный NSFetchedResultsController - PullRequest
4 голосов
/ 19 января 2012

Как я могу индексировать NSFetchedResultsController, чтобы я мог реализовать индекс AZ для табличного представления.

Я вижу, что в инициализаторе я могу сделать 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;
}  

Ответы [ 4 ]

13 голосов
/ 19 января 2012

реализовать 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 к вашему базовому объекту данных и замените sectionNameKeyPath в инициализации NSFetchedResultsController на firstLetter

1 голос
/ 08 февраля 2013

@ Ответ Харриса покажет весь алфавит на стороне таблицы. К сожалению, если вы затем нажмете одну из букв, у которой действительно есть соответствующий раздел, вы упадете с чем-то вроде

Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'Index title at 3 is not equal to 'K''
0 голосов
/ 20 апреля 2015

правильная версия (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;
}
0 голосов
/ 04 декабря 2012

Если вы хотите, чтобы буквы AZ находились сбоку (даже если у вас нет разделов для каждой буквы), это будет сделано:

- (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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...