2012-04-03 20 views
21

Uso de guión gráfico, las células estáticas, en cellForRowAtIndexPath: la líneacélulas Storyboard estáticas: dequeueReusableCellWithIdentifier devuelve nil

UITableViewCell *cell = 
    [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

siempre devuelve nil.

He comprobado los siguientes:

  • identificador de la célula se ajusta correctamente en IB/Storyboard y lo uso el mismo identificador en el código. Lo verifiqué muchas veces.
  • No he instanciado el controlador de vista en otro lugar (que fue el problema en this stackoverflow question).

Mi controlador de vista es una subclase de UITableViewController, por supuesto, se envolvió en un controlador ad hoc de navegación en guión. Sospechando que mi controlador de vista de alguna manera no sabe acerca de los identificadores de celda definidos en el guión gráfico porque podría ser otra instancia, aquí está el código que "lo instancia". En prepareForSegue:, utilizo

CustomViewController *vc = [[[segue destinationViewController] 
    viewControllers] objectAtIndex:0]; 

Otras personalizaciones del controlador de vista hacerse aquí (configuración de las propiedades, etc.) funciona bien.

Estoy usando celdas estáticas porque el número de secciones y filas no cambia, y cada celda contiene texto estático (y otros controles o campos de texto para editar).

Me parece que esta es una tarea muy común (personalice las celdas estáticas del guión gráfico en los métodos del origen de datos del controlador de la vista). ¿Qué estoy haciendo mal?

+0

Deberá mostrarnos dónde maneja realmente la creación de su celda personalizada. Esa es la parte importante. – borrrden

+0

Creo la celda personalizada en el guión gráfico. Escriba "Personalizado" y su propio identificador de celda. ¿No funciona así? – Mundi

+0

Me perdí toda la parte estática. Las células estáticas están diseñadas por completo en el guión gráfico. ver la parte 2 de este excelente tutorial www.raywenderlich.com/5191/beginning-storyboards-in-ios-5-part-2 – borrrden

Respuesta

44

Con el contenido estático en una vista de tabla, no implementa ninguno de los métodos de fuente de datos (incluido tableView:cellForRowAtIndexPath:, por lo que nunca quita la cola de las celdas. No hay dequeuing para el contenido estático (que puede involucrarse, de todos modos) .

Si desea obtener un puntero a una celda en particular:

  • la obtiene de la vista de tabla utilizando cellForRowAtIndexPath::

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    
  • tienen una salida a la celda específica y la personalizan directamente.

  • Iterar a través de las células y comprobar la propiedad reuseIdentifier para obtener la celda en la que está interesado.

Cualquiera de estas cosas se pueden hacer en viewWillAppear o similar.

Si desea tener contenido completamente diferente en sus celdas al encontrado en el guión gráfico, entonces las celdas estáticas probablemente no sean la opción correcta. Debería usar prototipos dinámicos (tenga en cuenta que puede tener múltiples prototipos en el guión gráfico) con los métodos de fuente de datos tradicionales en su lugar.

+0

Gracias - por lo que quiero hacer parece que realmente necesito usar células prototipo. ¿Podría agregar eso a su respuesta, para que pueda verificarlo? Gracias por sus aclaraciones! – Mundi

+0

Editado mi respuesta, en realidad no dijiste lo que estabas tratando de hacer, ¡así que espero que ayude! – jrturton

+0

Estoy tratando de tener etiquetas de título estáticas y campos de texto editable en algunas de las celdas, y algunos otros controles en otros. Pensé que puedes completar datos dinámicamente en celdas estáticas. El número o la posición de las celdas no cambia. Empecé a hacerlo con células prototipo, y es mucho trabajo, ¡casi peor que antes del guión gráfico! – Mundi

0

La solución fue utilizar células prototipo en lugar de células estáticas. Todavía le doy el cheque a @jrturton ya que él fue el primero que me dio la idea.

Otro error interesante que acabo de resolver: con celdas prototipo de tipo "Personalizado", si intenta llenar cell.textLabel con texto, funcionará automáticamente, pero todas las otras subvistas se comportarán de manera muy extraña. Solo uso mi etiqueta personalizada ahora, y todo funciona bien.

Saludos, gracias a todos por su ayuda.

+0

¿cómo usaste la celda "Personalizada"? porque dequeueReusableCellWithIdentifier devuelve nil? –

+0

Puede especificar "Personalizado" en el Creador de interfaz. – Mundi

+0

Especifiqué Custom en Interface Builder, luego subclasé el UITableViewCell y le asigné esta celda. Pero trae células dinámicas vacías. –

0

diferente a la respuesta anterior,

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

no va a funcionar. Pero el método mencionado para crear una salida al cell está funcionando.

También es posible colocar vistas como UIButtons o UITextFields en el cell y también tener salidas para ellas.

Ambos métodos también se pueden utilizar en combinación. P.ej. configure el cell.textLabel.text para una celda en particular y tenga otro control al que se accederá desde la salida de controles.

0

En el guión gráfico, las células estáticas NO PUEDEN implementar los métodos en el protocolo <UITableViewDataSource>.

Para que pueda usar los métodos que se incluyen en <UITableViewDelegate>.

0

Puede seguir utilizando los métodos dataSource/delegate de static UITableView, simplemente no tiene que crear celdas nuevas.

Si desea modificar las células con métodos dataSource, dentro cellForRowAtIndexPath::

UITableViewCell * cell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; 

y luego comenzar a modificar celular.

Cuestiones relacionadas