2009-11-13 6 views
2

J'ai créé une application très simple où j'essaie d'insérer une cellule personnalisée dans une vue de table. Cependant, chaque fois que je retourne une instance de la cellule personnalisée, un rien est affiché sur l'écran et en second lieu, l'application entre dans une sorte de boucle infinie étrange. Toute aide serait très appréciée. J'ai joint mon code dans cette question.Création de cellule personnalisée prend l'application iphone dans une boucle infinie

-- view controller which is returning custom cells --- 

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


    // Try to recover a cell from the table view with the given identifier, this is for performance 
    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomCell"]; 

    // If no cell is available, create a new one using the given identifier 
    if (cell == nil) { 
    NSArray *topLevelObjects = [[NSBundle mainBundle] 
    loadNibNamed:@"sample_1ViewController" owner:self options:nil]; 
    for (id currentObject in topLevelObjects) 
    { 
    if ([currentObject isKindOfClass:[CustomCell class]]) 
    { 
    cell = currentObject; 
    break; 
    } 
    } 
    } 

    // Fill the cell 
cell.lbl.text = @"test"; 
return cell; 

} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
return 4; 
} 

--- custom cell class --- 

@interface CustomCell : UITableViewCell { 
IBOutlet UILabel * lbl; 
} 

@property (nonatomic, retain) IBOutlet UILabel * lbl; 

@end 

@implementation CustomCell 

@synthesize lbl; 

@end 

---- 

La cellule personnalisée est une ressource UITableCellView dans le fichier sample_1ViewController.xib. Il contient un UILabel. L'identifiant de CustomCell est également CustomCell.

S'il vous plaît voir si vous pourriez trouver quelque chose qui pourrait être faux ou me parler de quelque chose qui me manque peut-être.

Cordialement Nitin

+0

Sur quoi est la trace de la pile de la boucle infinie? – gcamp

Répondre

3

Est-ce que sample_1ViewController.nib contiennent une instance de votre classe viewController?

Votre code semble recharger ce fichier nib entier chaque fois que dequeueResuableCellWithIdentifier: renvoie zéro, et si ce fichier nib contient une instance de la même classe viewController, il continuera à essayer de recharger le fichier nib indéfiniment.

Depuis tout ce que vous devez faire est de renvoyer une instance de la classe de cellules, que diriez-vous:

Tout d'abord, ajouter une variable d'instance tableCell à votre classe viewController:

@class CustomCell; 
@interface MyViewController 
{ 
    CustomCell * tableCell; 
} 
@end 

Créer l'instance unique de votre cellule dans votre méthode init:

- (id)initWithNibName:(NSString *)nibNameOrNil 
       bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self == nil) { return nil; } 

    tableCell = [[CustomCell alloc] init]; 

    return self; 
} 

Assurez-vous de le libérer dans dealloc:

- (void)dealloc 
{ 
    [tableCell release]; 
} 

Et maintenant, votre méthode déléguée devient:

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    tableCell.lbl.text = @"test"; 
    return tableCell; 
} 
+0

Le principal problème avec ce code est qu'il suppose que chaque ligne aura le même contenu: "test". Je pense que c'était une simplification pour afficher la question et qu'en pratique une cellule singleton ne suffira pas. – zaph

+0

Merci beaucoup. Havent l'a essayé, mais cela a beaucoup de sens. Donc, fondamentalement, la vue associée au contrôleur d'autres vues personnalisées ne peut pas être dans la même définition xib. Juste par curiosité, viewController remplace l'instance de vue dans ce cas. – user210504

+0

@zaph: C'est en fait la façon dont les cellules sont normalement utilisées. L'idée est que la même cellule est réutilisée dans plusieurs endroits (sinon tous) dans la table. Naturellement, quelque chose à propos de la cellule devra être changé à chaque fois, et je suppose que c'est ce que le PO a l'intention de faire dans la méthode des délégués. Son exemple original montre simplement l'ajout d'une étiquette «test», donc j'ai fait la même chose dans mon exemple pour éviter d'encombrer l'explication. –

0

Il a également été mon problème. Je mets la vue de la cellule dans le même xib du TableView et

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

i appelé

[[NSBundle mainBundle] loadNibNamed:CELLE_NIB owner:self options:nil]; 

Merci les gars!