a aplicación @UITableView bloquea la aplicación
Prefaci: Soy nuevo en iPhone SDK, Obj-C, Interface Builder y Cocoa. Probablemente estoy haciendo algo obviamente mal.
Pregunt: Tengo unUITableView
que se bloquea si lo desplazo. Se desplazará un poco para revelar la celda completa de la celda inferior medio oculta, pero no cargará la siguiente. Del mismo modo, si me desplazo más allá de la parte superior para ocultar por completo la parte inferior de la celda, y se vuelven las gomas para mostrar esa celda, se bloqueará antes de mostrarla. Esto me parece extraño porque está dibujando las primeras 7 de 11 celdas correctamente. Los datos de la celda están en unaNSArray
, en unUITableViewController
vinculado como ambosdataSource
ydelegate
Para elUITableView
en Interface Builder. Funciona cuando se inicializa la vista.
Estoy creando una aplicación que pensé que terminaría hace 2 días que solo calcula combinaciones y muestra una lista de ellas en lo que pensé que sería una conveniente vista de la tabla de desplazamiento. En este momento, ni siquiera calcula todo, laNSArray
en elDataSource
se inicializa una vez con algunas cadenas como@"Hello"
y@"World"
.
Pasos para reproduci: Debido a que estoy usando IB, no puedo mostrarle exactamente la historia completa en código. Así que voy a describir lo que hice hasta ahora y espero que no te dé sueño.
He hecho una nueva "Aplicación de barra de pestañas" en Xcode, porque quiero 2 pestañas y no quiero una barra de navegación ni una tabla de pantalla completa. Moví laMainWindow.xib
a primera pestaña de @ se ve enFirstView.xib
como análogo a la @ daSecondView.xib
. Esto funcionó muy bien. Modifiqué la vista para contener dosUITextField
s para entradas y unaUITableView
para salida. Esto funcionó pero la mesa estaba vacía. Subclase elUITableViewController
donde llené unaNSArray
propiedad denominadacombinations
con 11 cadenas, y luego agregó
// Set up the cell...
cell.userInteractionEnabled = NO;
cell.text = [combinations objectAtIndex:indexPath.row];
donde solo había habido el comentario. En IB agregué unTable View Controller
alFirstView.xib
y establezca el nombre de su clase para que coincida con el nombre de esta nueva subclase, y arrastre con control elTable View
en mi opinión sobre esteCombinations Table View Controller
dos veces. Una vez que vincula eldataSource
y una vez quedelegate
. Aunque obtengo el mismo comportamiento si solo ladataSource
está vinculado
Esto ejecuta y llena las filas visibles de la tabla (6.5) con los primeros 7 valores en eldataSource
combinations
. YOlat Desplácese 0.5 celdas hacia abajo y luego hacia arriba. Pero si desplazo más de 0.5 celdas hacia arriba o hacia abajo, la aplicación se bloqueará. La explicación en el informe dice:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '*** -[NSCFTimer tableView:cellForRowAtIndexPath:]:
unrecognized selector sent to instance 0x52ca40'
No hice unNSCFTimer
ni lo vinculé a miTable View
, Sospecho que lacellForRowAtIndexPath
es exactamente un mensaje que debería haber ido a midataSource
odelegate
así que estoy confundido sobre por qué se extravió y hacia dónde terminó yendo.
Actualiza: Gracias por las respuestas y comentarios. Mi problema parece ser que laCombinationsTableViewController
(subclase deUITableViewController
) en realidad no se instancia ningún lugar en particular en mi código. Se crea en algún momento (cuando elFirstView.xib
se carga) y aparentemente se gestiona mientras el tableView inicial se llena con 7 celdas, y luego se libera. Entonces necesito identificar dónde / cómo hacer una referencia retenida a este controlador. MiApplication Delegate
robablemente @ debería tener alguna salida que contenga este controlador que pueda vincularse como la instancia que se encuentra enxib
. Sí, soy nuevo en esto. Sé que podría eliminar estos problemas evitando el IB y haciendo cosas explícitamente en el código, pero creo que quiero aprender a usar el IB de manera flexible.
Finalment: Sí, necesitaba una instancia retenida del controlador de vista de tabla. Suena elemental, pero esto no estaba claro cuando trabajaba con el IB como lo hice yo. Lea mi propia publicación para todo el proceso y corríjala.
Apart: O el depurador necesita instrucciones detalladas (se agradece cualquier enlace) o no funciona muy bien. Parece que obtengo más información más rápidamente dejando que la aplicación se bloquee y leyendo el informe que genera. Pero esto requiere una terminación tediosa, un relanzamiento y 3 clics. Tenía muchas ganas de pasar de esto a conectar las entradas, hacer el cálculo y actualizar la tabla con cada cambio. Se supone que esa es la parte difícil, no esto haciendo que un miembro del marco funcione.
Más divagaciones: Todo esto estaba en el iPhone SDK para 2.2.1. En ese momento, el iPhone OS 3.0 no beta aún no estaba disponible sin unirse al club por dinero en efectivo. Esperaba que fuera en la apertura de WWDC 2009, pero en realidad fue hoy (17 de julio de 2009) que el SDK 3.0 público gratuito estuvo disponible.