2011-01-03 11 views
30

Tengo un problema simple. Creé una UITableViewCell personalizada que incluye un UISwitch en Interface Builder.¿Cómo crear una UITableViewCell con un UISwitch y obtener los datos?

Pregunta 1: ¿Una manera más fácil y mejor de hacerlo? Pregunta 2: Cuando se usa en un UITableViewController, ¿cuál sería la mejor forma de obtener los datos? En algún momento, o bien tengo que pasar por la tabla y verificar cada celda sobre el estado O enviar algún comentario cuando el estado de los interruptores cambia directamente?

Gracias por la ayuda.

Respuesta

83

Puede agregar el UISwitch en la vista de accesorios. Esa es la forma más fácil de hacerlo, sin mencionar que se ve 'elegante'.

Luego, en su código de controlador de vista de tabla, puede simplemente llamar a un selector cada vez que se conmuta el interruptor, o incluso alternar el interruptor obteniendo el estado actual del conmutador en su controlador.

Hazle saber si deseas una muestra de código.

--- --- código de ejemplo

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    //add a switch 
    UISwitch *switchview = [[UISwitch alloc] initWithFrame:CGRectZero]; 
    cell.accessoryView = switchview; 
    [switchview release]; 
} 

cell.textLabel.text = [NSString stringWithFormat:@"%d", indexPath.row]; 

return cell; 
} 

Entonces, usted podría tener un método que actualiza un interruptor basado en los cambios en su modelo. Se podría utilizar cualquier cosa que usted quiere - delegados, notificaciones, MVA, etc.

Ejemplo:

- (void)updateSwitchAtIndexPath:(NSIndexPath *)indexPath { 
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 
UISwitch *switchView = (UISwitch *)cell.accessoryView; 

if ([switchView isOn]) { 
    [switchView setOn:NO animated:YES]; 
} else { 
    [switchView setOn:YES animated:YES]; 
} 

} 
+0

código smaple sería genial, gracias – eemceebee

+0

Editado para incluir algunos ejemplos de código. –

+0

Me pregunto si tendrías un ejemplo con respecto a KVO usado para UISwitch. Intento implementar como 'UISwitch * switchview = [[UISwitch alloc] initWithFrame: CGRectZero]; celular.accessoryView = switchview; [switchview addObserver: self forKeyPath: @ "on" options: NSKeyValueChangeSetting context: NULL]; 'pero mi función' - (void) observeValueForKeyPath: (NSString *) keyPath ofObject: (id) object change: (NSDictionary *) contexto de cambio: (void *) context { NSLog (@ "observeValorParaKeyPath"); } 'no se invocó cuando el valor del Switch cambió – user454083

3

dos opciones:

1) inicializar su celda con un puntero a su modelo de datos. Haga que la célula implemente la devolución de llamada del delegado para el cambio. Cuando el cambio cambie, use el puntero a su modelo de datos para reflejar la nueva configuración. Alternativamente, inicialice la celda con un puntero a su controlador de vista. Haga que la célula implemente el método de delegado de conmutación, luego vuelva a llamar a su controlador de vista con la información de contexto de celda apropiada.

2) haga que su controlador de vista implemente la devolución de llamada delegada del conmutador. Cuando el conmutador cambia, determine qué conmutador/célula era (puede tener que configurar la propiedad "etiqueta" del conmutador para que sea un número de fila, o algo así) y maneje la actualización en el contexto de su controlador de visualización.

4

Gracias. no tengo su indexPath, pero se puede identificar una célula o un objeto con una etiqueta como esta:

if (indexPath.row == 0) { 
     cell.textLabel.text = @"Twitter"; 


     UISwitch *switchview = [[UISwitch alloc] initWithFrame:CGRectZero]; 
     switchview.tag = 111; 
     //switchview.selected = 0; 
     cell.accessoryView = switchview; 

     [switchview addTarget:self action:@selector(updateSwitchAtIndexPath) forControlEvents:UIControlEventTouchUpInside]; 

     //cell.accessoryType =UITableViewCellAccessoryDisclosureIndicator; 
     //[switchview release]; 

    } 


- (void)updateSwitchAtIndexPath { 

for (UITableViewCell * cell in tblView.subviews) { 

    for (UISwitch *swch in cell.subviews) { 


     UISwitch *switchView = (UISwitch *)cell.accessoryView; 

     if (switchView.tag == 111) { 

      if ([switchView isOn]) { 
       NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ON"); 
      }else{ 
       NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> OFF"); 
      } 

     } 

      if (switchView.tag == 222) { 
      if ([switchView isOn]) { 
       NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ON"); 
      }else{ 
       NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> OFF"); 
      } 

     } 
    } 
} 

}

+1

mientras configuramos UITableViewCell que podemos hacer como ... esto con etiqueta ** '[switchview addTarget: self action: @selector (updateSwitchAtIndexPath) forControlEvents: UIControlEventTouchUpInside] ; '** –

8
Switch.tag = indexPath.row; 
[Switch addTarget:self action:@selector(updateSwitchAtIndexPath:) forControlEvents:UIControlEventTouchUpInside]; 



- (void)updateSwitchAtIndexPath:(UISwitch *)aswitch{ 
    FFLog(@"%i",aswitch.tag); 
} 
+0

Gracias por la clara explicación ... ¡finalmente funcionó! – Remixed123

1

Para obtener el valor de la UISwitch en Swift 3 y Swift 4 puede agregar un objetivo a ella:

func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell { 

    ... 

    cell.uiSwitch.tag = 100 
    cell.uiSwitch.addTarget(self, action: #selector(ViewController.switchAtValueChanged(switchFromTableViewCell:)), for: UIControlEvents.valueChanged) 

    ... 
} 

Y se puede obtener el valor de la siguiente manera:

@objc func switchAtValueChanged(uiSwitch: UISwitch) { 

    if uiSwitch.tag == 100 { 
     let value = uiSwitch.isOn 
    } 
} 
Cuestiones relacionadas