2010-07-08 6 views
0

J'ai un UIView et dessus j'ai placé une vue de table, la tableview utilise des cellules personnalisées alimentées par un NSArray. Une certaine étrangeté se produisant dans ce que je peux seulement obtenir la table pour montrer 2 cellules même s'il y a 10 cellules là et toutes les 10 sont peuplées.UITableView avec cellule personnalisée

J'ai une plume différente arrangée de la même manière et cela fonctionne parfaitement.

Capture d'écran de ce qui se passe (5 est la 5ème des 10 cellules qui sont toutes remplies de données).

http://img692.imageshack.us/img692/1465/screenshot20100708at215.jpg

-(UITableViewCell *)tableView:(UITableView *)tblView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"ISB points cellForRowAtIndexPath start"); 
    NSLog(@"Elements in array = %d",[self.listData count]); 
    // 
    static NSString *cellID = @"PointsCellIdentifier"; 

    PointsCustomCell *cell = [tblView dequeueReusableCellWithIdentifier:cellID]; 

    if(cell == nil) 
    { 
     NSArray *nibObjects = [[NSBundle mainBundle]loadNibNamed:@"PointsCustomCell" owner:nil options:nil]; 

     for(id currentObject in nibObjects) 
     { 
      NSLog(@"nibObjects count = %d", [nibObjects count]); 

      if([currentObject isKindOfClass:[PointsCustomCell class]]) 
      { 
       cell = (PointsCustomCell *)currentObject; 
      }// if 
     }// for 
    }// if 

    if(indexPath.row < [listData count]) 
    { 
     RiderPointsData *riderPts = (RiderPointsData *)[listData objectAtIndex:indexPath.row];  
     cell.posLabel.text = riderPts.pos; 
     cell.nameLabel.text = riderPts.name; 
     cell.pointsLabel.text = riderPts.points; 
     cell.winsLabel.text = riderPts.wins; 
     //[riderPts release];    
    } 

    NSLog(@"ISB points cellForRowAtIndexPath end"); 

    return cell; 
} 
+1

Post le code que vous utilisez pour le délégué de la source de données TableView – Avalanchis

+0

Au lieu de publier le code dans un commentaire, s'il n'y a pas de mise en forme, modifiez votre question avec le code approprié. –

+0

Où se trouve votre [tableView: numberOfRowsInSection:] (http://developer.apple.com/iphone/library/documentation/uikit/reference/UITableViewDataSource_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UITableViewDataSource/tableView: NumberOfRowsInSection :) méthode? Que renvoie * it *? – progrmr

Répondre

0

Il ressemble que certaines données dans listData est NULL. Comment remplissez-vous votre liste de données? Je suppose que c'est mieux si vous ajoutez ces deux lignes et voyons la sortie de la console.

//add this line in tableView:cellForRowAtIndexPath: 
NSLog(@"indexPath.row = %d listData.count = %d ",indexPath.row,[listData count]); 
//add this line in if(indexPath.row < [listData count]) 
NSLog(@"RiderPointsData = %@ %@", riderPts,[riderPts class]); 
+0

indexPath.row = 1 listData.count = 10 RiderPointsData = RiderPointsData – Del

+0

Une seule ligne a été atteinte? Si vous êtes sûr que votre tableView: numberOfRowsInSection: est correcte. Vous pouvez essayer de supprimer et de reconnecter vos prises de table avec son délégué et sa source de données dans IB. Cette astuce m'a aidé à résoudre d'étranges problèmes sur tableview. – syoleen

1

On dirait que vous êtes itérer sur tous les objets de votre plume, qui comprennent probablement le UITableViewCell et 4 UILabels qu'il contient, et seulement une partie du temps est la cellule se correctement affectée.

Vous n'avez pas besoin du tableau nibObjects ou de votre boucle for. Si vous attribuez loadNibNamed un paramètre owner, le propriétaire du fichier sera défini sur cette valeur. Vous n'avez pas non plus besoin du contrôle indexPath.row < [listData count] si votre méthode numberOfRowsInSection renvoie [listData count]. Donc, changer votre code:

-(UITableViewCell *)tableView:(UITableView *)tblView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellID = @"PointsCellIdentifier"; 

    PointsCustomCell *cell = [tblView dequeueReusableCellWithIdentifier:cellID]; 

    if(cell == nil) 
    { 
    [[NSBundle mainBundle]loadNibNamed:@"PointsCustomCell" owner:self options:nil]; 

    // assign IB outlet to cell 
    cell = self.cellOutlet; // cellOutlet should be whatever you name your IBOutlet 
    self.cellOutlet = nil; 

    }// if 

    RiderPointsData *riderPts = (RiderPointsData *)[listData objectAtIndex:indexPath.row];  
    cell.posLabel.text = riderPts.pos; 
    cell.nameLabel.text = riderPts.name; 
    cell.pointsLabel.text = riderPts.points; 
    cell.winsLabel.text = riderPts.wins; 

    return cell; 
} 

et:

  1. Créer une prise UITableViewCell dans votre contrôleur
  2. Faites votre contrôleur propriétaire dans PointsCustomCell.xib
  3. du fichier Bind votre UITableViewCell à la sortie vous avez créé à l'étape 1
+0

Merci, mais quand j'ai essayé votre code, l'application se bloque. Terminaison de l'application en raison d'une exception non interceptée 'NSInternalInconsistencyException', raison: 'UITableView dataSource doit renvoyer une cellule de tableView: cellForRowAtIndexPath: – Del

+0

Désolé, le code a été mis à jour. Après avoir chargé la plume, votre objet UITableViewCell IBOutlet est rempli, mais vous devez toujours l'affecter au pointeur de cellule local * que vous renvoyez. –

+0

Essayé cela, maintenant il ne tombe pas en panne, mais fait exactement la même chose que mon propre code faisait. c'est-à-dire que la vue de table affiche une seule cellule – Del

Questions connexes