2010-02-03 6 views
-1

Pourquoi ne puis-je pas ajouter une sous-vue à la vue de contenu de la cellule de vue de table?Programmation de vue de table

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellTableIdentifier = @"CellTableIdentifier "; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellTableIdentifier]; 
    if (cell == nil) 
    { 
     cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellTableIdentifier]; 
     UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 5, 70, 15)]; 
     [email protected]"Name:"; 
     [cell.contentView addSubview:label]; 
    } 
    return [cell autorelease]; 

} 
+4

Parce que quelque chose ne va pas. (Fournissez des détails si vous voulez de bonnes réponses.) – kennytm

+0

Vous pouvez certainement! Si vous avez des problèmes avec votre code ici - il est vraiment impossible de vous aider sans le voir. – Vladimir

+1

Eh bien, il ne peut pas mettre à jour la question avec plus d'informations si vous les gars le fermer :) – willcodejavaforfood

Répondre

3

Cela devrait poser un problème de gestion de la mémoire.

Considérez cette déclaration:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellTableIdentifier]; 

Selon le Cocoa memory management rule, ce n'est pas une méthode alloc/new/copy, à savoir que vous ne possédez pas le cell, vous devriez donc pas -release après la fin En l'utilisant. Cependant, la déclaration suivante (en supposant cell != nil):

return [cell autorelease]; 

fera le cell être libéré (un peu plus tard), provoquant une double sortie de la cellule (un peu plus tard). Par conséquent, vous devriez simplement return cell;.

Maintenant, que faire si cell == nil? A l'intérieur de la branche if, vous avez écrit

cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellTableIdentifier]; 

Depuis le cell est créé avec alloc, vous êtes responsable de -release il. Mais puisque vous allez le rendre à d'autres, vous devez renoncer à la propriété tout en évitant qu'il soit désaffecté immédiatement. C'est là que -autorelease est utilisé, pour transférer temporairement la propriété à un "pool de libération automatique" afin que l'autre code puisse avoir une chance de reprendre la propriété (-retain) avant qu'il ne soit vidé dans le vide. Dans les autres termes, remplacez cette instruction par cell = [[[...] autorelease];.

De même, vous devriez -release le label car c'est -alloc -ed et vous n'êtes plus le propriétaire. Cependant, vous n'avez pas besoin de -autorelease car vous êtes sûr qu'il existe déjà un autre propriétaire (cell.contentView).

Pour résumer, vous devez réécrire le code comme:

static NSString *CellTableIdentifier = @"CellTableIdentifier "; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellTableIdentifier]; 
if (cell == nil) 
{ 
    cell=[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellTableIdentifier] autorelease]; 
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 5, 70, 15)]; 
    [email protected]"Name:"; 
    [cell.contentView addSubview:label]; 
    [label release]; 
} 
return cell; 

BTW, vous pouvez utiliser UITableViewCellStyleValue2 (comme le carnet d'adresses) pour éviter de jouer avec la hiérarchie de la vue.

Questions connexes