2010-02-08 15 views
43

que en realidad no veo mi error:UITableView dataSource debe devolver una célula de tableView: cellForRowAtIndexPath: Excepción

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 

    FriendTableViewCell *cell = (FriendTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[FriendTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     [[NSBundle mainBundle] loadNibNamed:@"FriendTableViewCell" owner:self options:nil]; 
     cell = friendCell; 
    } 
    cell.lblNickname.text = @"Tester"; 
    return cell; 
} 

¿Qué estoy haciendo mal? Lo revisé todo dos veces ... pero no veo el error.

Gracias por su ayuda!

Respuesta

66

Está volviendo friendCell, y es muy probable que no.

Su código se ve bien, así que asegúrese de tener su archivo de Interface Builder configurado correctamente. En FriendTableViewCell.xib, asegúrese de que el Propietario del archivo sea su controlador de vista de tabla y que configure correctamente la celda como una salida a friendCell (que supongo que es una UITableViewCell).

+1

Gracias, después de registrarme de nuevo encontré una conexión de salida faltante en Interface Builder. – phx

+1

Gracias, tu respuesta es justo lo que necesitaba. Cambié el nombre de la clase de controlador de vista, rompiendo la conexión con IB sin pensar en ello. ¡No más nombres cambiantes porque no me gustan! –

+0

¡Gran respuesta, generalmente el problema es algo sobre devolver una celda nula! – Fattie

2

Está creando un FriendTableViewCell y luego ignorándolo y configurándolo igual a (presumiblemente) una variable de instancia llamada friendCell.

Supongo que espera que friendCell se configure al llamar al método loadNibNamed. Aparentemente no está siendo establecido.

Así que tiene dos problemas con este código. Primero, no asigne una celda dos veces.

cell = [[[FriendTableViewCell .... 
[[NSBundle mainBundle ..... 
cell = friendCell; 

Obviamente, la creación de una nueva célula y asignándole a la celda es inútil si va a sobrescribir con la segunda llamada a la asignación a las células.

En segundo lugar, friendCell es probablemente nil. Asegúrese de que el NIB esté configurado correctamente y que los enchufes estén apuntando a los lugares correctos.

+0

Gracias por su ayuda! friendCell es mi Outlet, entonces, ¿cómo configurarlo correctamente? – phx

0

vistazo aquí: Loading TableViewCell from NIB

Este es el documento de Apple para este tema exacto.

//This is assuming you have tvCell in your .h file as a property and IBOutlet 
//like so: 
TableViewController.h 
@property(nonatomic,retain) IBOutlet UITableViewCell *tvCell; 
//Data Source Method... 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 

if (cell == nil) { 

    [[NSBundle mainBundle] loadNibNamed:@"TVCell" owner:self options:nil]; 

    cell = tvCell; 

    self.tvCell = nil; 

utilice el método loadNibNamed: owner: options para cargar una celda en un plumín. Establezca la instancia de celda en su objeto de plumilla, luego establezca el objeto de plumilla en nulo.

Lea el resto de la documentación que he vinculado para saber cómo acceder a las subvistas dentro de su celda.

2

Sé que esta es una publicación anterior ahora, pero acabo de encontrar este error, me pareció muy extraño, ya que la aplicación estaba en pruebas, por lo que no compilaciones nuevas durante unos días y lo hice, todo lo que hice fue reiniciar el teléfono y lo resolvió.

33

Para mí, funcionó hacer esto:

if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 

ACTUALIZACIÓN
Coloque el código anterior en el siguiente método:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

Sólo hay que poner ANTES la edición del tableViewCell

0

No olvides configurar cell identifier en Interface Builder.

0

Usar este,

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:kCellID]; 

me salvaron unas horas más con sólo estas líneas.

0

Asegúrese de identificador de su reutilización en el archivo de la SEMILLA/Storyboard para sus partidos de células prototipos de lo que ha llamado CellIdentifier

static NSString *CellIdentifier = @"Cell"; 
1

he encontrado que este problema vino cuando se trata de crear mi UITableViewCell antes de la inicialización de mi vista de tabla:

Aquí el registro de la clase antes de crear el tableView causará el error, colocándolo después reparará el error.

[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:bCellIdentifier]; 

tableView = [[UITableView alloc] initWithFrame:CGRectZero]; 
tableView.delegate = self; 
tableView.dataSource = self; 

[self addSubview:tableView]; 

tableView.keepInsets.equal = KeepRequired(0); 
+0

en mi caso llamo a la función para cargar datos antes de la tabla UITableViewCell registrar, upvote como respuesta me ayuda a superar este problema – iphonemaclover

Cuestiones relacionadas