objective-c iphone tablecell checkmark

objective c - Cambio de marca de verificación de UITableViewCell en seleccionar



objective-c iphone (7)

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

  2. En el controlador de la vista -tableView:cellForRowAtIndexPath: método delegado, establezca el tipo de accessoryType de la cell en UITableViewCellAccessoryCheckmark si la UITableViewCellAccessoryCheckmark la celda es igual al valor de la indexPath.row selectedRow . De lo contrario, UITableViewCellAccessoryNone en UITableViewCellAccessoryNone .

  3. En su vista controlador -tableView:didSelectRowAtIndexPath: método delegado, establezca el valor selectedRow en el indexPath.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; }