objective c - Cambio de marca de verificación de UITableViewCell en seleccionar
objective-c iphone (7)
Mantenga una propiedad en su controlador de vista llamada
selectedRow, que representa el índice de una fila que representa el elemento marcado en una sección de la tabla.En el controlador de la vista
-tableView:cellForRowAtIndexPath:método delegado, establezca el tipo deaccessoryTypede lacellenUITableViewCellAccessoryCheckmarksi laUITableViewCellAccessoryCheckmarkla celda es igual al valor de laindexPath.rowselectedRow. De lo contrario,UITableViewCellAccessoryNoneenUITableViewCellAccessoryNone.En su vista controlador
-tableView:didSelectRowAtIndexPath:método delegado, establezca el valorselectedRowen elindexPath.rowque está seleccionado, por ejemplo:self.selectedRow = indexPath.row
¿Estoy en lo correcto al pensar que para cambiar la marca de verificación de "activado" a "desactivado", debo cambiar el CellAccessoryType la CellAccessoryType entre none y la checkmark de checkmark en didSelectRowAtIndexPath ?
Porque he hecho esto, pero he notado que el comportamiento no es perfectamente idéntico al de las celdas de marca de verificación en la configuración de bloqueo automático del iPhone.
¿O hay alguna otra forma de controlar las marcas de verificación?
¡Zyphrax sugirió una gran solución que funcionó muy bien para mí! Y si necesita borrar la fila seleccionada anterior, simplemente use:
[self.tableView reloadData];
en
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
Debería ser
didHighlightRowAtIndexPath
en lugar de
tableView: didSelectRowAtIndexPath
La respuesta de Alex funcionó solo para mí después de agregar la tabla de recarga, en .h
{
int selectedCell;
}
@property(nonatomic,readwrite)int selectedCell;
en .m * cellForRowAtIndexPath *
if(indexPath.row == selectedCell)
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
cell.selected = YES;
}
else
{
cell.accessoryType = UITableViewCellAccessoryNone;
cell.selected = NO;
}
y en cualquier lugar didHighlightRowAtIndexPath o didSelectRowAtIndexPath
self.selectedCell = indexPath.row;
[self.tableView reloadData];
Otra solución:
-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSIndexPath *oldIndex = [self.tableView indexPathForSelectedRow];
[self.tableView cellForRowAtIndexPath:oldIndex].accessoryType = UITableViewCellAccessoryNone;
[self.tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
return indexPath;
}
Y sí: no tienes que comprobar si oldIndex es nil :)
Swift 3 y más tarde:
override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
if let oldIndex = tableView.indexPathForSelectedRow {
tableView.cellForRow(at: oldIndex)?.accessoryType = .none
}
tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
return indexPath
}
rápido:
var selectedCell:UITableViewCell?{
willSet{
selectedCell?.accessoryType = .None
newValue?.accessoryType = .Checkmark
}
}
entonces:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
selectedCell = self.tableView.cellForRowAtIndexPath(indexPath)
self.mapView.selectAnnotation(self.mapView.annotations[indexPath.row], animated: true)
}
Si desea utilizar su imagen personalizada como accesorio, escriba el código a continuación
-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UIImageView *imgCheckMark = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"select_icon.png"]];
[imgCheckMark setFrame:CGRectMake(self.view.frame.size.width - 30, 25, 14, 18)];
imgCheckMark.tag = 1000+indexPath.row;
NSIndexPath *oldIndex = [self.tblSelectService indexPathForSelectedRow];
[self.tblSelectService cellForRowAtIndexPath:oldIndex].accessoryView = UITableViewCellAccessoryNone;
[self.tblSelectService cellForRowAtIndexPath:indexPath].accessoryView = imgCheckMark;
return indexPath;
}