Ai-je raison de penser que pour changer la coche de "on" en "off", je dois changer le CellAccessoryType
entre none
et checkmark
sur le didSelectRowAtIndexPath
?
Parce que j’ai fait cela, mais j’ai remarqué que le comportement n’est pas parfaitement identique à celui des cellules cochées sur les paramètres de verrouillage automatique sur l’iphone.
Ou y a-t-il un autre moyen de cocher les cases à cocher?
Conservez une propriété dans votre contrôleur de vue appelée selectedRow
, qui représente l'index d'une ligne représentant l'élément vérifié dans une section de tableau.
Dans la méthode de délégation -tableView:cellForRowAtIndexPath:
de votre contrôleur de vue, définissez la accessoryType
de la cell
sur UITableViewCellAccessoryCheckmark
si le indexPath.row
de la cellule est égal à la valeur selectedRow
. Sinon, définissez-le sur UITableViewCellAccessoryNone
.
Dans la méthode de délégation -tableView:didSelectRowAtIndexPath:
de votre contrôleur de vue, définissez la valeur selectedRow
sur le indexPath.row
sélectionné, par exemple: self.selectedRow = indexPath.row
.
Une autre solution:
-(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;
}
Et oui: vous n'avez pas à vérifier si oldIndex
est nil
:)
Swift 3 et plus tard:
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
}
Zyphrax a suggéré une excellente solution qui fonctionnait très bien pour moi! Et si vous devez effacer la ligne sélectionnée précédemment, utilisez simplement:
[self.tableView reloadData];
dans
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
Alex answer n'a travaillé pour moi qu'après avoir ajouté la table de rechargement, in .h
{
int selectedCell;
}
@property(nonatomic,readwrite)int selectedCell;
dans .m * cellForRowAtIndexPath *
if(indexPath.row == selectedCell)
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
cell.selected = YES;
}
else
{
cell.accessoryType = UITableViewCellAccessoryNone;
cell.selected = NO;
}
et n'importe où dans didHighlightRowAtIndexPath ou didSelectRowAtIndexPath
self.selectedCell = indexPath.row;
[self.tableView reloadData];
Rapide:
var selectedCell:UITableViewCell?{
willSet{
selectedCell?.accessoryType = .None
newValue?.accessoryType = .Checkmark
}
}
puis:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
selectedCell = self.tableView.cellForRowAtIndexPath(indexPath)
self.mapView.selectAnnotation(self.mapView.annotations[indexPath.row], animated: true)
}
CA devrait etre
didHighlightRowAtIndexPath
au lieu de
tableView: didSelectRowAtIndexPath
Pour Swift
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
tableView.cellForRow(at: indexPath)?.accessoryType = .none
}
Si vous souhaitez utiliser votre image personnalisée comme type d'accessoire, utilisez ci-dessous le code
-(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;
}