2009-08-12 6 views
0

Dans beaucoup d'applications iPhone, je vois un UITableViewController utilisé comme liste de cases à cocher. (Voir, pour un exemple de ce que je veux dire, Auto-Lock sous Paramètres)Sélection d'un élément par défaut lors de l'utilisation de UITableViewController comme liste de cases à cocher

En essayant de l'implémenter moi-même, j'ai dû passer par beaucoup de cerceaux pour avoir un élément sélectionné par programme par défaut (ie. , la valeur actuelle pour ce que la liste représente). Le mieux que j'ai pu trouver est en redéfinissant la méthode viewDidAppear selon moi classe contrôleur:

- (void)viewDidAppear:(BOOL)animated { 
    NSInteger row = 0; 

    // loop through my list of items to determine the row matching the current setting 
    for (NSString *item in statusItems) { 
     if ([item isEqualToString:currentStatus]) { 
      break; 
     } 
     ++row; 
    } 

    // fetch the array of visible cells, get cell matching my row and set the 
    // accessory type 
    NSArray *arr = [self.tableView visibleCells]; 
    NSIndexPath *ip = [self.tableView indexPathForCell:[arr objectAtIndex:row]]; 
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:ip]; 
    cell.accessoryType = UITableViewCellAccessoryCheckmark; 

    self.lastIndexPath = ip; 

    [super viewDidAppear:animated]; 
} 

Est-ce le meilleur/seulement/meilleure façon d'obtenir une référence à une cellule particulière et indexPath si Je veux marquer une ligne par défaut?

Répondre

1

Pour afficher les éléments d'état, vous devez implémenter tableView:cellForRowAtIndexPath: de toute façon, n'est-ce pas? Alors, pourquoi ne pas mettre juste le type d'accessoire de la cellule avant de retourner la cellule, comme ceci:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    // dequeue or create cell as usual 

    // get the status item (assuming you have a statusItems array, which appears in your sample code) 
    NSString* statusItem = [statusItems objectAtIndex:indexPath.row]; 

    cell.text = statusItem; 

    // set the appropriate accessory type 
    if([statusItem isEqualToString:currentStatus]) { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 
    else { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 

    return cell; 
} 

Votre code est extrêmement fragile, en particulier parce que vous utilisez [self.tableView visibleCells]. Que se passe-t-il s'il y a plus d'éléments d'état que de lignes à l'écran (comme son nom l'indique, visibleCells ne renvoie que les cellules actuellement visibles de la vue tabulaire)?

+0

Vous voyez, j'ai pensé que j'étais stupide avec ce code. Lent cerveau aujourd'hui: P – Dana

Questions connexes