Pergunta

Estou tentando implementar um UitableView de dados principal que suporta a indexação (por exemplo: os caracteres que aparecem no lado e os cabeçalhos da seção que os acompanham). Não tenho problemas de implementação sem dados principais usando:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;

Também não tenho nenhum problema em implementar uma View Uitable que seja apoiada pelos dados principais sem usar a indexação.

O que estou tentando descobrir é como combinar elegantemente os dois? Obviamente, depois de indexar e re-selecionar o conteúdo, você não pode mais usar o NSFetchedResultSultSController padrão para recuperar as coisas em um determinado caminho de índice. Por isso, estou armazenando minhas cartas de índice em um NSARRAY e meu conteúdo indexado em um nsdictionary. Tudo isso funciona bem para exibição, mas tenho algumas dores de cabeça reais quando se trata de adicionar e excluir linhas, especificamente como implementar adequadamente esses métodos:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller;

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath;

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type;

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller;

Porque os caminhos do índice, ele está me retornando não tem correlação com os dos dados principais. Consegui trabalhar, simplesmente reconstruindo meu índice nsarray e nsdictionary quando o usuário adiciona uma linha, mas fazendo o mesmo quando ele exclui um trava todo o aplicativo.

Existe um padrão/exemplo simples que estou perdendo aqui para fazer tudo isso funcionar corretamente?

EDIT: Apenas para esclarecer, sei que o NSFetchedResultScontroller faz isso fora da caixa, mas o que eu quero é replicar a funcionalidade como o aplicativo de contatos, onde o índice é a primeira letra do primeiro nome da pessoa.

Foi útil?

Solução

Você deve usar o seu COREDATA NSFETCHEDRESULTSCONTROLER para obter suas seções/índices.
Você pode especificar a chave da seção na solicitação de busca (acho que ela deve corresponder à primeira chave de classificação):

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
initWithKey:@"name" // this key defines the sort
ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext
sectionNameKeyPath:@"name" // this key defines the sections
cacheName:@"Root"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

Em seguida, você pode obter os nomes da seção como este:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo name];
}

E os índices da seção estão aqui:

id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
[sectionInfo indexTitle]; // this is the index

Alterações no conteúdo apenas indicam que a tabela precisa ser atualizada:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView reloadData];
}

ATUALIZAR
Isso funciona apenas para o índice e a rolagem rápida do índice, não para os cabeçalhos da seção.
Ver esta resposta Para "como usar o primeiro caractere como nome de seção" para obter mais informações e detalhes sobre como implementar as primeiras letras para cabeçalhos de seção, bem como o índice.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top