¿Seguir obteniendo nada desde dequeueReusableCellWithIdentifier?

He creado una celda prototipo con el identificador "mainViewTableCell" en el file de storyboard y he conectado la vista de la tabla principal con una class de controller personalizada llamada "NTTableViewController". He implementado la function "tableView cellForRowAtIndexPath" en NTTableViewController.m como sigue:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString* MAINVIEW_CELLIDENTIFIER = @"mainViewTableCell"; UITableViewCell *newCell = [tableView dequeueReusableCellWithIdentifier: MAINVIEW_CELLIDENTIFIER]; if (newCell == nil) { newCell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: MAINVIEW_CELLIDENTIFIER]; [newCell autorelease]; newCell.selectionStyle = UITableViewCellSelectionStyleNone; } NTContactItem* currentItem = [self.contactItemContainer objectInContainerAtIndex: indexPath.row]; NSString* firstName = currentItem.firstName; NSString* lastName = currentItem.lastName; NSString* fullName = [firstName stringByAppendingFormat: lastName]; [newCell.textLabel setText: fullName]; [newCell.detailTextLabel setText: currentItem.mobilePhone]; return newCell; } 

Pero sigo recibiendo nil de dequeueReusableCellWithIdentifier y tengo que crear una nueva instancia de celda cada vez.

Entonces, ¿qué está mal?

El código: proyecto

Gracias a todos de antemano.

Con storyboards y vistas de tabla que tienen celdas prototipo, [tableView dequeueReusableCellWithIdentifier:] no debe devolver nil. Incluso si esta es la primera celda y no hay celdas en la queue de reutilización, la vista de tabla creará una nueva instancia de su celda prototipo y la devolverá.

En su caso, el problema fue totalmente diferente (descargué su proyecto porque tenía curiosidad).

En el delegado de su application:didFinishLaunchingWithOptions: en su application:didFinishLaunchingWithOptions: method, está reinicializando este tableviewcontroller. Cuando llama [masterController init] , llama a [super init] , que a su vez llama [UITableViewController initWithStyle:] .

Eso hace que el controller cree una nueva UITableView, que es diferente de la que está en su storyboard. Ese nuevo UITableView no tiene células prototipo, y por eso dequeueReusableCellWithIdentifier: devuelve nil.

La lección, por supuesto, es no volver a inicializar un object Objective-C que ya se ha inicializado. Cuando su controller de vista de tabla se cargue desde el guión gráfico, el mecanismo de carga lo inicializará con initWithCoder: Entonces, si necesita hacer algún trabajo de initialization personalizado (como configurar ese NSMutableArray en su caso), simplemente anule initWithCoder: y / o awakeFromNib .

Puede anular estos methods según sea necesario, pero no los llame usted mismo. Tanto initWithCoder: y awakeFromNib serán invocados por el mecanismo Storyboard / nib loading.

Si todo es correcto, no necesitas crear celdas programáticamente aquí. Este bit de código no debería ser necesario:

 // This bit is unnecessary with storyboards: if (newCell == nil) { newCell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: MAINVIEW_CELLIDENTIFIER]; [newCell autorelease]; newCell.selectionStyle = UITableViewCellSelectionStyleNone; } 

Espero que ayude.

Después de leer la respuesta de @ Firoze, arreglé mi problema que me perseguía durante días … y encontré otra solución. Sé que la pregunta ya fue respondida, pero esto puede ayudar a alguien.

En mi caso, había hecho refactorización (extrajo un nuevo TableViewController), y luego obtuve devoluciones nulas de dequeueReusableCellWithIdentifier .

La solución para mí fue hacer esto en lugar de llamar a alloc/init en mi ViewController en didSelectRowAtIndexPath :

 UIStoryboard* sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; MyTableViewController* controller = [sb instantiateViewControllerWithIdentifier: @"MyTableViewController"]; 

(Entonces llamo [self.navigationController pushViewController:controller animated:YES]; – no es la manera más limpia, pero funciona)

Las celdas de tabla solo se vuelven reutilizables cuando están ocultas, por lo que solo debe tener el número de celdas que está visualizando actualmente en la memory. ¿Cuántas celdas está mostrando y cuántas están asignadas?

Por si acaso podría ayudar a alguien en el futuro … En mi caso, olvidé cambiar el contenido de TableView (Storyboard) de "Celdas estáticas" a "Prototypes dynamics".

Causa típica:

[tableView dequeueReusableCellWithIdentifier: @"id"]; no coincide con Xcode> Inspector de atributo> Vista de tabla Celda > Identificador > id