2011-06-26 9 views
8

¿Cómo obtengo la celda para un indexPath que actualmente no está visible en la tabla? (Celular está fuera de rango)iOS SDK: ¿Cómo obtener una celda en una vista de tabla que no está visible?

Código para conseguir mi celular:

NSString *name = [[(ELCTextfieldCell *)[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]] rightTextField] text]; 

-cellForRowAtIndexPath... vuelve nil porque la celda en la indexPath requerido está fuera de rango. Entonces, ¿cómo obtengo la celda correcta y no nulo?

+0

Sírvanse proporcionar más información y el código. – dasdom

+0

OK, tengo una vista de tabla agrupada, donde algunas celdas tienen campos de texto y al final hay celdas que representan botones. Ahora tengo el problema de que si estoy al final de la vista de tabla, mi primer par de celdas está ahora fuera de rango, pero si hago clic en una celda que representa un botón, necesito la información provista al principio. Ahora probé: [[(ELCTextfieldCell *) [tableView cellForRowAtIndexPath: [NSIndexPath indexPathForRow: 0 inSection: 0]] rightTextField] text] but -cellForRowAtIndexPath: ... devuelve nil porque la celda está fuera de rango. Entonces, ¿cómo obtengo la celda correcta (y no nada)? –

+0

La respuesta a su pregunta es como dice nacho4d: no use las celdas para obtener la información, recíbala de su fuente de datos subyacente. La respuesta más amplia es que parece estar usando una vista de tabla para diseñar una interfaz de usuario desplazable en lugar de usar una vista en una rueda de desplazamiento. – Abizern

Respuesta

4

Así no es como funciona. Debe capturar y almacenar la información tan pronto como se ingrese o cambie. Puede salir fácilmente del alcance y no puede garantizar que su celda viva lo suficiente. Bueno, técnicamente puedes mantenerlo (y siempre devuelves la misma celda para la misma ruta de índice), pero cuestionaría ese diseño.

+0

OK, pero tengo una tabla donde las celdas se pueden agregar dinámicamente y no sé cuántas celdas producirá el usuario. –

+0

Creo que el único enfoque razonable es guardar los cambios tan pronto como suceden. Es posible que tenga dificultades para recuperar esos datos más adelante, y que la célula ya esté "muerta" y liberada. – Eiko

15

El UITableView solo conserva las celdas visibles. Si necesita uno que no sea visible, debe llamar al tableView:cellForRowAtIndexPath: del UITableViewdataSource. Por lo tanto, si uno mismo es una clase que es la dataSource:

UITableViewCell * cell = [self tableView:table cellForRowAtIndexPath:indexPath]; 
+0

¡gracias! ¡Funciona! : D –

+2

En general, no conservará los datos que se ingresaron en esas celdas. Solo funciona si aún está en caché. – Eiko

+0

¡¡funciona ... !!! muchas gracias.ahorraste muchas horas mías –

2

UITableViewCells están hechos para ser reutilizado/reciclado de una manera que los usuarios no tendrán que crear más células que el número de las visibles. Normalmente no necesita acceder a una celda que no está visible. Debería ser suficiente que acceda a su fuente de datos y obtenga/configure los datos correspondientes allí. Las celdas son para mostrar algún estado de la fuente de datos. No es la fuente de datos en sí :)

Editar:

Usted ha dicho que necesita un poco de información (texto) de una célula anterior, ¿verdad? Si usa el método cellForRowAtIndexPath:, la celda se volverá a crear pero es posible que no obtenga el texto que estaba en el campo de texto. ¿La razón? porque probablemente no lo guardaste en otro lugar. Si lo guardó, acceda a él directamente en lugar de ir a través de la celda.

0

¿La información para llenar su tabla proviene de una matriz? ¿No podría sacarlo directamente de la matriz en el índice 0, igual que su celdaForRowAtIndexPath presumiblemente recuperaría y llenaría esa celda cuando se muestra?

+0

¡No, pero ya lo resolví! :) –

0

En continúan @ respuesta de Rafael, aquí está la solución rápida (de trabajo) 3:

UITableViewCell cell = self.tableView(self.tableView, cellForRowAt: indexPath)

Cuestiones relacionadas