2008-11-30 5 views
1

J'ai le code suivant qui est trivial à première vue. Je définis simplement vouloir définir le type de police à la Géorgie avec une taille de 14 si la cellule provient du résultat d'une recherche ou s'il y a un compte de zéro dans mon tableau d'étudiants.La dernière cellule indexée dans UITableView prend une mauvaise police

Cependant, avec cette cellule de code particulière qui est la dernière dans mon tableView prend la police de la Géorgie avec la taille 14. Toutes les autres cellules fonctionnent correctement. Où dans mon code est la logique mal?

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSInteger row = [indexPath row]; 
    NSInteger section = [indexPath section]; 

    static NSString *CellIdentifier = @"Student"; 
    cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    // Configure the cell 
    if([studentsSearch count] > 0) { 
     cell.text = (NSString *)[[[studentsSearch objectAtIndex:section] objectAtIndex:row] valueForKey:@"name"]; 
     cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; 
    } else { 
     if(isSearching == YES) 
      cell.text = @"No students available."; 
     else 
      cell.text = @"No students have been added for this school."; 

     cell.font = [UIFont fontWithName:@"Georgia" size:14]; 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 

    return cell; 
} 

EDIT

Ce qui semble se produire est lorsque le contrôleur de vue s'instancié et poussé sur le dessus de la pile du contrôleur de navigation, mon tableau est studentsSearchnil. Je le peupler dans ce contrôleur.

Ainsi lors de l'initialisation, la cellule a sa police à la Géorgie avec une taille de 14 parce que le count est < 0. Cependant, une fois que je remplir le tableau studentsSearch et Rechargement des données de la tableView, la police semble coller à partir de quand la vue a été initialisée.

Je suppose maintenant que je dois trouver comment remettre la police à cette cellule à ce que la valeur par défaut est.

Répondre

2

Je ne suis pas tout à fait sûr que ce que vous demandez, mais je note que vous ne définissez la police à Georgia 14 lorsque vous avez un résultat de recherche; sinon, vous l'ignorez. Si vous avez une cellule avec sa police définie dans la seconde branche if/then, puis récupérez cette cellule (en utilisant dequeueReusableCellWithIdentifier :), elle aura déjà son jeu de polices.

La solution est plus simple d'ajouter

cell.font = [UIFont systemFontOfSize: 14]; 

après

cell.text = (NSString *)[[[... 
    cell.accessoryType = ... 

dans la première branche. Gardez à l'esprit que les cellules de table sont recyclées.

+0

Bonjour Ben.Essentiellement, j'essaie de définir la police uniquement lorsqu'un résultat de recherche est vide ou lorsqu'il n'y a aucun étudiant dans le tableau studentsSearch. C'est pourquoi ils sont dans ce bloc d'ailleurs. Le problème ici est, même quand j'ai dit 10 étudiants, le 10ème étudiant prend encore la police de Georgia. – Coocoo4Cocoa

+0

J'ai également remarqué après avoir lancé des invocations arbitraires de NSLog que lors de la première charge de tableView, l'une des polices de cellules est en effet modifiée en police Georgia. Il semble que cette cellule est réutilisée une fois que j'ai rempli le tableau studentsSearch et rechargé la table, d'où la modification de la police. – Coocoo4Cocoa

+0

... et c'est pourquoi vous devez réinitialiser sa police à tout ce que vous utilisez ailleurs. L'autre alternative consiste à utiliser deux identifiants de cellule différents, un pour la recherche, un autre pour les autres. –

2

Disons que votre table a 15 lignes visibles. Cela signifie que vous avez environ 15 cellules (ou quelques autres) qui sont créées et, comme je l'ai dit, recyclées. Même si votre table contient des centaines de lignes, elle utilisera toujours les mêmes 15 cellules.

Dans ce cas, vous ne réinitialisez jamais la taille de la police, donc une fois que vous avez défini cette taille de police sur une cellule, elle sera utilisée sur toute ligne après celle qui réutilise la cellule. Donc, si vos studentsSearch count> 0, vous devez vous assurer de définir la taille de la police à quelle que soit votre base (17?).

1

Je vous suggère d'identifier la cellule 'spéciale' en lui attribuant un identifiant de cellule différent.

Dans ce cas, vous devez demander la cellule spéciale avec l'identificateur de réutilisation de cellule, par ex. @ "None", et si la cellule n'a pas encore été créée, créez-en une et définissez sa police. De cette façon, vous créez une cellule supplémentaire avec un identifiant spécial, et elle est séparée des autres cellules régulières de votre table.

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSInteger row = [indexPath row]; 
    NSInteger section = [indexPath section]; 

    static NSString *StudentCellIdentifier = @"Student"; 
    static NSString *NoneCellIdentifier = @"None"; 

    // did we find students? 
    BOOL found = [studentsSearch count] > 0; 

    // get/create correct cell type 
    cell = [tv dequeueReusableCellWithIdentifier:(found ? StudentCellIdentifier : NoneCellIdentifier)]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithFrame:CGRectZero 
       reuseIdentifier:(found ? StudentCellIdentifier : NoneCellIdentifier)]; 
    } 

    // return a student, or None cell if no studnts found 
    if(found) 
    { 
     cell.text = (NSString *)[[[studentsSearch objectAtIndex:section] objectAtIndex:row] valueForKey:@"name"]; 
     cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; 
    } 
    else 
    { 
     if(isSearching == YES) 
      cell.text = @"No students available."; 
     else 
      cell.text = @"No students have been added for this school."; 
     cell.font = [UIFont fontWithName:@"Georgia" size:14]; 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 

    return [cell autorelease]; 
}