2010-05-02 6 views
0

Je passe par le livre Beginning iPhone Development & coincé dans le chapitre 9. J'ai passé quelques heures à essayer de déboguer cette erreur sans succès:Erreur d'exécution de débogage: 'NSInternalInconsistencyException', raison: 'UITableView dataSource doit renvoyer une cellule de tableView: cellForRowAtIndexPath'

2010-05-01 19:27:51.361 Nav2[4113:20b] *** Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit/UIKit-984.38/UITableView.m:4709 
2010-05-01 19:27:51.362 Nav2[4113:20b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:' 
2010-05-01 19:27:51.364 Nav2[4113:20b] Stack: (
... 
) 

Je ne suis pas à la recherche d'aide avec le livre, mais des conseils sur la façon de debug cette erreur. Puis-je déterminer laquelle de mes méthodes cellForRowAtIndexPath est le problème? Et comment inspecter le type? Ou d'autres choses devrais-je regarder?

Modifier: Comme demandé, le code pour les deux méthodes suspectes:

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

    static NSString *RootViewControllerCell = @"RootViewControllerCell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:RootViewControllerCell]; 
    if (cell == nil) { 
     cell == [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:RootViewControllerCell] autorelease]; 
    } 

    NSUInteger row = [indexPath row]; 
    SecondLevelViewController *controller = [controllers objectAtIndex:row]; 
    cell.textLabel.text = controller.title; 
    cell.image = controller.rowImage; 
    return cell; 
} 

-

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

    static NSString * DisclosureButtonCellIdentifier = 
    @"DisclosureButtonCellIdentifier"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: 
          DisclosureButtonCellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
             reuseIdentifier: DisclosureButtonCellIdentifier] 
       autorelease]; 
    } 
    return cell; 

    NSUInteger row = [indexPath row]; 
    NSString *rowString = [list objectAtIndex:row]; 
    cell.textLabel.text = rowString; 
    cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; 
    [rowString release]; 
    return cell; 
} 
+0

S'il vous plaît ajouter votre code pour votre méthode déléguée. –

Répondre

5

Vous avez un supplément signe égal, i.e. .:

cell == [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:RootViewControllerCell] autorelease]; 

devrait être:

cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:RootViewControllerCell] autorelease]; 
+0

KAAAAAAAAAAAAAAAAHHHHHHHHHNNNNNNNNNNNNNN !!!!!!!!!!!!!!!!!!! Sérieusement, merci à vous deux. – Bill

1

L'une des meilleures façons serait de mettre sur la première des points d'arrêt de ligne toutes les méthodes cellForRowAtIndexpath:, puis exécutez le code avec le débogage activé. Faites tout ce qui appelle l'exception et vous devriez apparaître dans votre méthode rapidement.

Une fois que vous êtes en phase de débogage, parcourez la méthode. Vous pouvez utiliser "po objectname" pour obtenir des informations sur divers objets tels qu'ils sont référencés depuis votre méthode. Il est facile d'invoquer depuis la console, et vous pourriez obtenir ce dont vous avez besoin simplement en passant la souris sur les variables pendant que vous passez le code. En guise d'estimation, vous ne renvoyez pas un UITableViewCell hors de votre méthode.

+0

Ah, ça aide. J'ai mis un point d'arrêt sur les deux déclarations de retour. Dans la première, je trouve que la cellule est essentiellement nulle: (gdb) cellule p 1 $ = (UITableViewCell *) 0x0 Il semble donc que «cellule == [[[UITableViewCell alloc] initWithFrame: CGRectZero reuseIdentifier: RootViewControllerCell ] autorelease]; 'échoue? – Bill

Questions connexes