La diferencia más importante es que la forIndexPath:
versión afirma (se bloquea) si no registró una clase o punta para el identificador. La forIndexPath:
versión anterior (no ) vuelve nil
en ese caso.
Usted registra una clase para un identificador enviando registerClass:forCellReuseIdentifier:
a la vista de tabla. Usted registra una punta para un identificador enviando registerNib:forCellReuseIdentifier:
a la vista de tabla.
Si crea su vista de tabla y sus prototipos de celda en un guión gráfico, el cargador del guión gráfico se encarga de registrar los prototipos de celda que definió en el guión gráfico.
La sesión 200: Novedades de Cocoa Touch de WWDC 2012 analiza la forIndexPath:
versión (entonces nueva) que comienza alrededor de los 8m30. Dice que "siempre obtendrá una celda inicializada" (sin mencionar que se bloqueará si no registró una clase o punta).
El video también dice que "será el tamaño correcto para esa ruta de índice". Presumiblemente, esto significa que establecerá el tamaño de la celda antes de devolverla, observando el ancho de la vista de la tabla y llamando al tableView:heightForRowAtIndexPath:
método de su delegado (si está definido). Es por eso que necesita la ruta del índice.
dequeueReusableCellWithIdentifier:forIndexPath:
será siempre volver una célula. Reutiliza las celdas existentes o crea una nueva y regresa si no hay celdas.Mientras que, el tradicional
dequeueReusableCellWithIdentifier:
devolverá una celda si existe, es decir, si hay una celda que se puede reutilizar, devuelve que, de lo contrario, devuelve nulo. Por lo tanto, también tendría que escribir una condición para verificar elnil
valor.Para responder a su pregunta, use
dequeueReusableCellWithIdentifier:
cuando desee admitir iOS 5 y versiones anteriores, yadequeueReusableCellWithIdentifier:forIndexPath
que solo está disponible en iOS 6+Referencia: https://developer.apple.com/library/ios/documentation/uikit/reference/UITableView_Class/Reference/Reference.html#//apple_ref/occ/instm/UITableView/dequeueReusableCellWithIdentifier:forIndexPath :
fuente
[self.tableView registerNib:[UINib nibWithNibName:@"cell" bundle:nil] forCellReuseIdentifier:@"cell"];
Nunca he entendido por qué Apple creó el método más nuevo, dequeueReusableCellWithIdentifier: forIndexPath :. Su documentación sobre ellos no está completa y es algo engañosa. La única diferencia que he podido discernir entre los dos métodos es que ese método anterior puede devolver nulo, si no encuentra una celda con el identificador pasado, mientras que el método más nuevo falla, si no puede regresar Una célula. Se garantiza que ambos métodos devuelven una celda, si ha configurado el identificador correctamente, y hacen la celda en un guión gráfico. Ambos métodos también están garantizados para devolver una celda si registra una clase o xib, y convierte su celda en código o en un archivo xib.
fuente
tableView.estimateHeight
, el tamaño de la celda también se determinará correctamente. Todavía no obtengo el beneficio del nuevo método.Para abreviar:
Hollemans M. 2016, Capítulo 2 Lista de verificación, IOS Apprentice (5th Edition). pp: 156.
fuente
Recomendaría usar ambos si está utilizando contenido dinámico generado. De lo contrario, su aplicación podría bloquearse inesperadamente. Puede implementar su propia función para recuperar una celda reutilizable opcional. Si esto es
nil
así, debe devolver una celda vacía que no es visible:Swift 3
Y la extensión para devolver una celda vacía:
Un ejemplo completo de cómo usarlo:
fuente