2010-09-22 10 views
72

Comment puis-je incorporer un UISwitch sur une cellule UITableView? Des exemples peuvent être vus dans le menu des paramètres.UISwitch dans une cellule UITableView

Ma solution actuelle:

UISwitch *mySwitch = [[[UISwitch alloc] init] autorelease]; 
cell.accessoryView = mySwitch; 
+3

Quel est le problème avec la façon actuelle que vous le faites? – MobileMon

Répondre

183

Le configurer comme accessoireView est généralement la voie à suivre. Vous pouvez le configurer dans tableView:cellForRowAtIndexPath: Vous pouvez utiliser la cible/action pour faire quelque chose lorsque le commutateur est inversé. Comme si:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    switch([indexPath row]) { 
     case MY_SWITCH_CELL: { 
      UITableViewCell *aCell = [tableView dequeueReusableCellWithIdentifier:@"SwitchCell"]; 
      if(aCell == nil) { 
       aCell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"SwitchCell"] autorelease]; 
       aCell.textLabel.text = @"I Have A Switch"; 
       aCell.selectionStyle = UITableViewCellSelectionStyleNone; 
       UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectZero]; 
       aCell.accessoryView = switchView; 
       [switchView setOn:NO animated:NO]; 
       [switchView addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged]; 
       [switchView release]; 
      } 
      return aCell; 
     } 
     break; 
    } 
    return nil; 
} 

- (void)switchChanged:(id)sender { 
    UISwitch *switchControl = sender; 
    NSLog(@"The switch is %@", switchControl.on ? @"ON" : @"OFF"); 
} 
+1

Au lieu de MY_SWITCH_CELL devrait être le numéro de cellule correspondant, je pense. Belle solution tout autour! – testing

+2

Bon point avec aCell.accessoryView = switchView; – konradowy

+0

comment écrire 'aCell.accessoryView = switchView;' avec la notation de parenthèse? – Jesse

10

Vous pouvez ajouter un UISwitch ou tout autre contrôle à accessoryView de la cellule. De cette façon, il apparaîtra sur le côté droit de la cellule, ce qui est probablement ce que vous voulez.

2

Vous pouvez préparer la cellule dans Interfacebuilder, la lier à un IBOutlet de votre Viewcontroller et la renvoyer lorsque la vue de table demande la bonne ligne. Au lieu de cela, vous pouvez créer un fichier xib séparé pour la cellule (à nouveau avec IB) et le charger en utilisant UINib lors de la création des cellules.

Enfin, vous pouvez créer le commutateur par programme et l'ajouter à votre vue de contenu ou accessoireview de cellules.

Lequel vous convient le mieux dépend en grande partie de ce que vous aimez faire. Si le contenu de votre tableviews est fixe (pour une page de paramètres, etc.) les deux premiers pourraient bien fonctionner, si le contenu est dynamique, je préférerais la solution programmatique. S'il vous plaît être plus précis dans ce que vous aimeriez faire, cela rendrait la réponse à votre question plus facile.

+0

Je préférerais la solution programmatique (en dépit d'une page de paramètres), mais je suis également intéressé par le fonctionnement des deux premières options. Peut-être pourriez-vous les expliquer un peu plus en détail. – testing

8
if (indexPath.row == 0) {//If you want UISwitch on particular row 
    UISwitch *theSwitch = [[UISwitch alloc] initWithFrame:CGRectZero]; 
    [cell addSubview:theSwitch]; 
    cell.accessoryView = theSwitch; 
} 
+0

Pourquoi utilisez-vous 'initWithFrame'? Pourquoi utilisez-vous 'addSubview'? 'switch' ne peut pas être utilisé comme nom de variable. – testing

+0

Désolé pour le nom du commutateur. J'ai eu du code .. Je viens de changer le nom de la variable. – kthorat

+0

Ça a marché pour moi. Solution efficace avec moins de code. –

Questions connexes