Изменение галочки UITableViewCell при выборе
Правильно ли я полагаю, что для изменения галочки для "on" на "off", я должен изменить CellAccessoryType
между none
и checkmark
на didSelectRowAtIndexPath
?
Потому что я сделал это, но я заметил, что поведение не совсем идентично поведению с ячейками галочки в настройках автоматической блокировки на iphone.
Или есть ли какие-то другие флажки, предназначенные для обработки?
Ответы
Ответ 1
-
Сохраните свойство в вашем контроллере вида с именем selectedRow
, который представляет индекс строки, представляющей отмеченный элемент в разделе таблицы.
-
В вашем представлении метода делегата -tableView:cellForRowAtIndexPath:
делегировать значение accessoryType
от cell
до UITableViewCellAccessoryCheckmark
, если ячейка indexPath.row
равна значению selectedRow
. В противном случае установите его на UITableViewCellAccessoryNone
.
-
В вашем режиме управления делегатом -tableView:didSelectRowAtIndexPath:
установите значение selectedRow
в indexPath.row
, которое выбрано, например: self.selectedRow = indexPath.row
Ответ 2
Другое решение:
-(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;
}
И да: вам не нужно проверять, имеет ли oldIndex
nil
:)
Свифт 3 и позже:
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
}
Ответ 3
Zyphrax предложила отличное решение, которое отлично поработало для меня! И если вам нужно очистить предыдущую выбранную строку, просто используйте:
[self.tableView reloadData];
в
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
Ответ 4
Это должно быть
didHighlightRowAtIndexPath
вместо
Tableview: didSelectRowAtIndexPath
Ответ 5
Ответ Alex работал у меня только после добавления таблицы перезагрузки,
в .h
{
int selectedCell;
}
@property(nonatomic,readwrite)int selectedCell;
в .m
* cellForRowAtIndexPath *
if(indexPath.row == selectedCell)
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
cell.selected = YES;
}
else
{
cell.accessoryType = UITableViewCellAccessoryNone;
cell.selected = NO;
}
и в любом месте didHighlightRowAtIndexPath или didSelectRowAtIndexPath
self.selectedCell = indexPath.row;
[self.tableView reloadData];
Ответ 6
скор:
var selectedCell:UITableViewCell?{
willSet{
selectedCell?.accessoryType = .None
newValue?.accessoryType = .Checkmark
}
}
то
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
selectedCell = self.tableView.cellForRowAtIndexPath(indexPath)
self.mapView.selectAnnotation(self.mapView.annotations[indexPath.row], animated: true)
}
Ответ 7
Если вы хотите использовать свой собственный образ в качестве аксессуара, используйте ниже код
-(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;
}
Ответ 8
Для быстрой
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
}