2010-05-03 3 views
1

J'ai fait une faute de frappe lors de la création d'un UITableViewCell avec ce code:Pourquoi ce code TableView fonctionne-t-il?

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"CellIdentifier"; 
    UITableViewCell *cell = [self.tableView 
     dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     NSLog(@"Creating cell"); 
     cell = [[[UITableViewCell alloc] 
      initWithStyle:UITableViewStylePlain 
      reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    cell.textLabel.text = @"Hello"; 
    return cell; 
} 

La faute de frappe est à l'utilisation UITableViewStylePlain au lieu de UITableViewCellStyleDefault. Le code a bien fonctionné, créant de nouvelles cellules. Pourquoi?

Répondre

10

Voici comment ces variables sont définies.

typedef enum { 
    UITableViewCellStyleDefault, 
    UITableViewCellStyleValue1, 
    UITableViewCellStyleValue2, 
    UITableViewCellStyleSubtitle 
} UITableViewCellStyle; 

typedef enum { 
    UITableViewStylePlain, 
    UITableViewStyleGrouped 
} UITableViewStyle; 

Les deux UITableViewCellStyleDefault et UITableViewStylePlain sont évalués à 0, ils sont donc interchangeables.

+0

Bah, tu m'as battu de 13 secondes! ;) –

+0

Aha! Merci kubi. –

+0

@Dave kubi

3

Parce que UITableViewStylePlain est déclarée comme:

typedef enum { 
    UITableViewStylePlain, 
    UITableViewStyleGrouped 
} UITableViewStyle; 

Et UITableViewCellStyleDefault est déclarée comme:

typedef enum { 
    UITableViewCellStyleDefault, 
    UITableViewCellStyleValue1, 
    UITableViewCellStyleValue2, 
    UITableViewCellStyleSubtitle 
} UITableViewCellStyle; 

Dans les deux cas, la valeur que vous parlez est la première dans le enum, ce qui signifie ils seront tous les deux compilés à 0. Par conséquent, ils sont "interchangeables" (bien que vous ne devriez certainement pas compter sur ce comportement dans le code de production).

+0

Merci pour le conseil. Cela semble être une erreur facile à faire (et non à attraper) car il n'y a pas de conséquences immédiates. –

1

Les deux UITableViewStylePlain et UITableViewCellStyleDefault sont des constantes avec une valeur entière. Lorsque vous en utilisez un, vous ne passez pas la constante à la méthode, mais la valeur de la constante.

Comme décrit dans les autres réponses, les deux constantes ont la même valeur entière, donc initWithStyle:reuseIdentifier recevra un ID de style avec lequel il peut travailler, et il ne remarquera même pas que vous avez fourni une constante qui n'a rien à faire avec cette méthode.

Questions connexes