Pergunta

Estou preenchendo um UabableViewController com um NSFetchedResultScontroller com resultados criando seções que preenchem cabeçalhos de seção e um índice de seção. Estou usando o seguinte método para preencher o índice da seção:

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

E agora eu encontrei um problema. Quando adiciono um novo elemento ao NSMANAGEDOBJETCONTEXT associado ao NSFetchedResultScontroller, o novo elemento é salvo e apropriadamente exibido como uma célula no UableView ... exceto por uma coisa. Se o novo elemento criar uma nova seção, o novo índice da seção não aparecerá na margem da mão direita, a menos que eu coloque a pilha do UinavigationController e recarregue o UabableViewController.

Eu me conformei com a interface do NSFetchedResultScontrollerDelegate e invocaram manualmente

[self.tableView reloadSectionIndexTitles];

No final de ambos os métodos delegados:

controller:didChangeSection... 
controller:didChangeObject...

E, embora eu possa depurar e rastrear a execução nos métodos e ver a chamada de recarga invocada, o índice da seção do UitableView nunca reflete as alterações da seção.

Novamente, os dados aparecem - novas seções são fisicamente visíveis (ou removidas) no UITableView, mas os índices de seção não são atualizados.

Estou esquecendo de algo?

Foi útil?

Solução

Parece que este é um bug que todos estamos tendo. Ver http://iphonedevelopment.blogspot.com/2009/11/i-i-nknow-youre-tired-of-hearing-about.html Pois o que me parece uma solução bastante desagradável demais para linhas de código. Eu fui com isso:

- (void)viewWillAppear:(BOOL)animated; {
  // This is a dumb hack required by this bug: http://iphonedevelopment.blogspot.com/2009/11/i-know-youre-tired-of-hearing-about.html
  [self.tableView reloadData];
}

Pode ser ineficiente, mas, a menos que você tenha resmas e resmas de dados, provavelmente não fará nenhum dano. E é apenas uma linha de código. Então, quando a Apple corrige o bug do bug, você pode retirá -lo facilmente.

Outras dicas

Pergunta já com 2 meses de idade, mas encontrei o mesmo problema hoje. Parece que -reloadSectionIndexTitles não está funcionando, então tentei alguns hacks em potencial quais das seguintes obras para mim:

@implementation UITableView (JKAdditions)

- (UIView *)indexView {
    Class indexClass = NSClassFromString(@"UITableViewIndex");
    for(UIView *subview in self.subviews){
        if([subview isKindOfClass:indexClass]) return subview;
    }
    return nil;
}

- (void)reloadSectionIndexTitles {
    UIView *indexView = [self indexView];
    [indexView performSelector:@selector(setTitles:) withObject:[self.dataSource sectionIndexTitlesForTableView:self]];
    [indexView setNeedsDisplay];
}

@end

Eu realmente não tenho idéia se a Apple rejeitar seu aplicativo por causa desse hack, mas parece ser a única opção para mim. Recarregar todo o TableView simplesmente não é o que eu quero, pois tenho que lidar com todos os tipos de problemas de animação.

Espero que isso ajude alguém a ter os mesmos problemas!

Para combinar a resposta aceita com a resposta de Alex Reynolds com o atraso, basta ligar reloadData com um atraso que corresponde à duração da animação, então 0,4 ou 0,3 segundos.

No meu caso, coloco o método atrasado chamado ao controlador: DidChangeSection: AtIndex: ForChangeType: (é um aplicativo de dados principal).

O resultado, quando uma seção é adicionada ou excluída, é a animação padrão da célula, seguida pelo índice que está sendo atualizado quando os dados são recarregados.

É feio e me faz estremecer, mas estou bem com o resultado. Também enviei um bug para a Apple, #8589547.

Tente colocá -lo no final de -controllerDidChangeContent:, em algum lugar depois [self.tableView endUpdates].

Outra coisa que faço (que funciona para mim, não posso garantir que funcionará para você) é realizar um seletor após um atraso muito curto, por exemplo:

[self performSelector:(@selector(refreshSectionIndex)) withObject:nil afterDelay:0.2];

// ...

- (void) refreshSectionIndex {
    [self.tableView reloadSectionIndexTitles];
}    

Dados principais e NSFetchedResultsController Em particular, parece o buggy como o inferno, onde as atualizações de exibição de tabela delegadas ficam fora de sincronia com os dados buscados, fazendo com que o aplicativo trava. Eu realmente espero que a Apple esteja tomando medidas para corrigir os bugs nessas estruturas no 4.0 SDK. É muito frustrante.

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