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 deaccessoryType
de lacell
enUITableViewCellAccessoryCheckmark
si laUITableViewCellAccessoryCheckmark
la celda es igual al valor de laindexPath.row
selectedRow
. De lo contrario,UITableViewCellAccessoryNone
enUITableViewCellAccessoryNone
.En su vista controlador
-tableView:didSelectRowAtIndexPath:
método delegado, establezca el valorselectedRow
en elindexPath.row
que 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;
}