A diferença mais importante é que a forIndexPath:
versão declara (trava) se você não registrou uma classe ou ponta para o identificador. A forIndexPath:
versão mais antiga (não ) retorna nil
nesse caso.
Você registra uma classe para um identificador enviando registerClass:forCellReuseIdentifier:
para a exibição de tabela. Você registra uma ponta para um identificador enviando registerNib:forCellReuseIdentifier:
para a visualização de tabela.
Se você criar sua exibição de tabela e seus protótipos de célula em um storyboard, o carregador de storyboard cuidará do registro dos protótipos de célula que você definiu no storyboard.
Sessão 200 - O que há de novo no Cocoa Touch da WWDC 2012 discute a forIndexPath:
versão (então nova) a partir dos 8m30s. Ele diz que “você sempre obterá uma célula inicializada” (sem mencionar que ela travará se você não registrar uma classe ou ponta).
O vídeo também diz que "será do tamanho certo para esse caminho de índice". Presumivelmente, isso significa que ele definirá o tamanho da célula antes de devolvê-la, examinando a largura da visualização da tabela e chamando o tableView:heightForRowAtIndexPath:
método do seu representante (se definido). É por isso que ele precisa do caminho do índice.
dequeueReusableCellWithIdentifier:forIndexPath:
vai sempre retornar uma célula. Ele reutiliza as células existentes ou cria uma nova e retorna se não houver células.Enquanto, o tradicional
dequeueReusableCellWithIdentifier:
retornará uma célula, se existir, ou seja, se houver uma célula que possa ser reutilizada, ela retornará e, caso contrário, ela retornará nula. Então você teria que escrever uma condição para verificar onil
valor também.Para responder à sua pergunta, use
dequeueReusableCellWithIdentifier:
quando desejar oferecer suporte ao iOS 5 e versões inferiores, pois eledequeueReusableCellWithIdentifier:forIndexPath
está disponível apenas no iOS 6 ou superiorReferência: https://developer.apple.com/library/ios/documentation/uikit/reference/UITableView_Class/Reference/Reference.html#//apple_ref/occ/instm/UITableView/dequeueReusableCellWithIdentifier:forIndexPath :
fonte
[self.tableView registerNib:[UINib nibWithNibName:@"cell" bundle:nil] forCellReuseIdentifier:@"cell"];
Eu nunca entendi por que a Apple criou o método mais recente, dequeueReusableCellWithIdentifier: forIndexPath :. A documentação deles não está completa e é um tanto enganadora. A única diferença que eu consegui discernir entre os dois métodos é que esse método mais antigo pode retornar nulo, se não encontrar uma célula com o identificador passado, enquanto o método mais novo trava, se não puder retornar. uma célula. É garantido que ambos os métodos retornam uma célula, se você definiu o identificador corretamente, e transformam a célula em um storyboard. Também é garantido que ambos os métodos retornem uma célula se você registrar uma classe ou xib e criar sua célula no código ou em um arquivo xib.
fonte
tableView.estimateHeight
, o tamanho da célula também será determinado adequadamente. Ainda não recebo o benefício do novo método.Como diminutivo:
Hollemans M. 2016, Capítulo 2 Checklist, IOS Apprentice (5ª Edição). pp: 156.
fonte
Eu recomendaria usar os dois se você estiver usando conteúdo gerado dinamicamente. Caso contrário, seu aplicativo poderá falhar inesperadamente. Você pode implementar sua própria função para recuperar uma célula reutilizável opcional. Se for,
nil
você deve retornar uma célula vazia que não é visível:Swift 3
E a extensão para retornar uma célula vazia:
Um exemplo completo de como usá-lo:
fonte