2010-09-22 12 views
72

Come è possibile incorporare unsu una cella UITableView? Gli esempi possono essere visti nel menu delle impostazioni.UISwitch in una cella UITableView

mia soluzione attuale:

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

Cosa c'è di sbagliato con l'attuale modo lo stai facendo? – MobileMon

risposta

183

Impostarlo come accessorioView è in genere la strada da percorrere. È possibile configurarlo in tableView:cellForRowAtIndexPath: È possibile che si desideri utilizzare la destinazione/l'azione per eseguire un'operazione quando lo switch è capovolto. In questo modo:

- (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

Invece di MY_SWITCH_CELL dovrebbe essere il numero di cella corrispondente, credo. Bella soluzione a tutto tondo! – testing

+2

Buon punto con aCell.accessoryView = switchView; – konradowy

+0

come si scrive 'aCell.accessoryView = switchView;' con notazione delle parentesi? – Jesse

10

È possibile aggiungere un'UISwitch o di qualsiasi altro controllo alla cella di accessoryView. In questo modo apparirà sul lato destro della cella, che è probabilmente quello che vuoi.

2

È possibile preparare la cella in Interfacebuilder, collegarla a un IBOutlet del Viewcontroller e restituirla quando il tableview richiede la riga corretta.

Invece, è possibile creare un xib separato per la cella (sempre con IB) e caricarlo utilizzando UINib al momento della creazione delle celle.

Infine, è possibile creare lo switch a livello di codice e aggiungerlo alla vista del contenuto delle celle o alla visualizzazione degli accessori.

Quale ti si addice meglio dipende in gran parte da cosa ti piace fare. Se il contenuto delle visualizzazioni delle tabelle è corretto (per una pagina delle impostazioni, ecc.) Le prime due potrebbero funzionare bene, se il contenuto è dinamico preferisco la soluzione programmatica. Si prega di essere più specifici in ciò che vorresti fare, questo renderebbe più facile rispondere alla tua domanda.

+0

Preferirei la soluzione programmatica (nonostante sia per una pagina delle impostazioni), ma sono anche interessato a come funzionano le prime due opzioni. Forse potresti spiegarli un po 'più in dettaglio. – 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

Perché usi 'initWithFrame'? Perché usi 'addSubview'? 'switch' non può essere usato come nome di variabile. – testing

+0

Ci scusiamo per il nome dell'interruttore. Avevo del codice .. Ho appena cambiato il nome della variabile. – kthorat

+0

Ha funzionato per me. Soluzione efficace con meno codice. –

Problemi correlati