2010-09-22 14 views
72

¿Cómo puedo incrustar un UISwitch en una celda UITableView? Los ejemplos se pueden ver en el menú de configuración.UISwitch en una celda UITableView

Mi solución actual:

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

¿Qué pasa con la forma actual en que lo está haciendo? – MobileMon

Respuesta

183

configurándolo como el accesorioViewView es generalmente el camino a seguir. Puede configurarlo en tableView:cellForRowAtIndexPath: Es posible que desee utilizar el objetivo/acción para hacer algo cuando se da la vuelta al interruptor. De la misma manera:

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

En lugar de MY_SWITCH_CELL debe ser el número de celda correspondiente, creo. Buena solución para todos! – testing

+2

Buen punto con aCell.accessoryView = switchView; – konradowy

+0

¿cómo se escribe 'aCell.accessoryView = switchView;' con notación de corchetes? – Jesse

10

se puede añadir un UISwitch o cualquier otro control a la célula de accessoryView. De esta forma, aparecerá en el lado derecho de la celda, que es probablemente lo que desea.

2

Puede preparar la celda en Interfacebuilder, vincularla a una IBOutlet de su Viewcontroller y devolverla cuando la tabla de tareas solicite la fila correcta.

En su lugar, puede crear un xib separado para la celda (de nuevo con IB) y cargarlo con UINib al crear las celdas.

Finalmente, puede crear el conmutador mediante programación y agregarlo a la vista de contenido o accesorio de sus celdas.

Cuál le conviene más depende en gran medida de lo que le gusta hacer. Si el contenido de su tabla vista es fijo (para una página de configuración, etc.), las dos primeras podrían funcionar bien, si el contenido es dinámico, preferiría la solución programática. Sea más específico en lo que le gustaría hacer, esto facilitaría la respuesta a su pregunta.

+0

Preferiría la solución programática (a pesar de que es para una página de configuración), pero también me interesa cómo funcionan las dos primeras opciones. Quizás puedas explicarlos un poco más en detalle. – 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

¿Por qué usas 'initWithFrame'? ¿Por qué usas 'addSubview'? 'switch' no se puede usar como un nombre de variable. – testing

+0

Lo siento por el nombre del interruptor. Tenía un código ... Solo cambié el nombre de la variable. – kthorat

+0

funcionó para mí. Solución efectiva con menos código. –

Cuestiones relacionadas