iphone uitableview uiswitch

iphone - ¿Cómo crear una UITableViewCell con un UISwitch y obtener los datos?



(5)

Dos opciones:

1) inicialice 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.

Tengo un problema simple Creé una UITableViewCell personalizada que incluye un UISwitch en Interface Builder.

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.


Gracias. No tengo su indexPath, pero puede identificar una celda u objeto con una etiqueta como This:

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"); } } } }

}


Para obtener el valor de UISwitch en Swift 3 y Swift 4, puede agregarle un objetivo:

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 puedes obtener el valor así:

@objc func switchAtValueChanged(uiSwitch: UISwitch) { if uiSwitch.tag == 100 { let value = uiSwitch.isOn } }


Simplemente podría agregar el UISwitch en su 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 tabla de vista, puede llamar a un selector cada vez que se alterna el interruptor, o incluso alternar el interruptor obteniendo el estado actual del interruptor en su controlador.

Déjeme saber si desea una muestra de código.

---Código de muestra---

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

Luego, podría tener un método que actualice un interruptor según los cambios en su modelo. Puede usar cualquier cosa que desee: delegados, notificaciones, KVO, 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]; } }


Switch.tag = indexPath.row; [Switch addTarget:self action:@selector(updateSwitchAtIndexPath:) forControlEvents:UIControlEventTouchUpInside]; - (void)updateSwitchAtIndexPath:(UISwitch *)aswitch{ FFLog(@"%i",aswitch.tag); }