ios - uitableviewdelegate - Как отключить выбор UITableView?
uitableviewcontroller (20)
Когда вы нажимаете строку в UITableView
, строка подсвечивается и выбирается. Можно ли отключить это, так что нажатие строки ничего не делает?
Objective-C:
Внизу снимок отключить выделение, но также отключить вызов
didSelectRowAtIndexPath
. Поэтому, если вы не используетеdidSelectRowAtIndexPath
используйте ниже метод. Это необходимо добавить, когда вы создаете таблицу. Однако это будет работать с кнопками иUITextField
внутри ячейки.self.tableView.allowsSelection = NO;
Внизу снимок отключить выделение, и он не отключает вызов
didSelectRowAtIndexPath
. Установите для стиля выделения ячейки значение None вcellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Ниже фрагмента отключить все, что есть в ячейке. Это отключит взаимодействие с
buttons
,textfields
:self.tableView.userInteractionEnabled = false;
Swift:
Ниже приведены эквиваленты Swift
выше, чем Objective-C
:
Замена первого решения
self.tableView.allowsSelection = false
Замена второго раствора
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Замена третьего решения
self.tableView.userInteractionEnabled = false
Вам просто нужно поместить этот код в cellForRowAtIndexPath
Чтобы отключить свойство выбора ячейки: (При нажатии на ячейку).
cell.selectionStyle = UITableViewCellSelectionStyle.None
Все, что вам нужно сделать, это установить стиль выделения на экземпляре UITableViewCell
используя:
Objective-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
или же
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3 и 4.x:
cell.selectionStyle = .none
Кроме того, убедитесь, что вы либо не реализуете -tableView:didSelectRowAtIndexPath:
в -tableView:didSelectRowAtIndexPath:
таблицы или явно исключаете ячейки, в которых вы не хотите действовать, если вы его реализуете.
Вы можете использовать это
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Вы также можете отключить выбор строки из самого конструктора интерфейса, выбрав NoSelection
из опции selection
(из свойств UITableView) в панели инспектора, как показано на рисунке ниже.
Вы также можете установить цвет фона в Clear для достижения того же эффекта, что и UITableViewCellSelectionStyleNone
, если вы не хотите / не можете использовать UITableViewCellSelectionStyleNone
.
Вы бы использовали следующий код:
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
Это может ухудшить вашу производительность, поскольку вы добавляете дополнительный цветной вид в каждую ячейку.
Для меня все работало нормально:
tableView.allowsSelection = NO;
Это означает, что didSelectRowAt#
просто не будет работать. То есть прикосновение к ряду таблицы, как таковое, ничего не сделает. (И, следовательно, очевидно, что никогда не будет выбранной анимации.)
(Обратите внимание: если на ячейках у вас есть UIButton
или любые другие элементы управления, конечно, эти элементы управления будут по-прежнему работать. Любые элементы управления, которые у вас есть на ячейке таблицы, полностью не связаны с возможностью UITableView, позволяющей вам «выбрать строку "using didSelectRowAt#
.)
Из UITableViewDelegate
Protocol вы можете использовать метод willSelectRowAtIndexPath
и return nil
willSelectRowAtIndexPath
если вы не хотите, чтобы выбранная строка была выбрана.
Точно так же вы можете использовать метод willDeselectRowAtIndexPath
и return nil
willDeselectRowAtIndexPath
если вы не хотите, чтобы строка была отменена.
Мы можем написать код, как
cell.selectionStyle = UITableViewCellSelectionStyleNone;
но когда у нас есть пользовательская ячейка xib выше строки, выдается предупреждение в это время для
пользовательский элемент xib
нам нужно установить стиль выбора None из построителя интерфейса
Подводя итог тому, что я считаю правильным, основываясь на собственном опыте реализации этого:
Если вы хотите отключить выбор только для некоторых ячеек, используйте:
cell.userInteractionEnabled = NO;
Помимо предотвращения выбора, это также останавливает tableView: didSelectRowAtIndexPath: вызывается для ячеек, которые он установил. (Кредит отправляется Тони Миллион за этот ответ, спасибо!)
Если у вас есть кнопки в ячейках, которые нужно щелкнуть, вам нужно:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
и вам также нужно игнорировать любые клики на ячейке in - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
.
Если вы хотите отключить выбор для всей таблицы, используйте:
tableView.allowsSelection = NO;
(Поблагодарите Пауло де Барроса, спасибо!)
Попробуйте ввести:
cell.selected = NO;
При необходимости он отменит выбор.
В Swift3 ...
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let r = indexPath.row
print("clicked .. \(r)")
tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true)
}
Ты можешь использовать ....
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Хотя это лучшее и простое решение, позволяющее предотвратить отображение строки во время выбора
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Я также хотел бы предложить, что иногда полезно кратко показать, что строка выбрана, а затем отключена. Это предупреждает пользователей с подтверждением того, что они намеревались выбрать:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
Это то, что я использую:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
в cellForRowAtIndexPath напишите этот код.
Я использую это, что работает для меня.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
для быстрого отмена выбора
cell.selectionStyle = .None
попробуй это
cell.selectionStyle = UITableViewCellSelectionStyleNone;
а также
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
и вы также можете установить стиль выбора с помощью interfacebuilder.
ФИКСИРОВАННОЕ РЕШЕНИЕ ДЛЯ SWIFT 3
cell.selectionStyle = .none
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Счастливое кодирование !!!