Как я могу отключить выбор UITableView?
Когда вы нажимаете строку в UITableView
, строка подсвечивается и выбирается. Можно ли отключить это, поэтому нажатие строки ничего не делает?
Ответы
Ответ 1
Для меня следующее работало нормально:
tableView.allowsSelection = false
Это означает, что didSelectRowAt#
просто не будет работать. То есть прикосновение к ряду стола как таковое абсолютно ничего не даст. (И, следовательно, очевидно, никогда не будет выбранной анимации.)
(Обратите внимание, что если в ячейках у вас есть UIButton
или какие-либо другие элементы управления, конечно, эти элементы управления все еще будут работать. Любые элементы управления, которые у вас есть в ячейке таблицы, совершенно не связаны со способностью UITableView, позволяющей вам "выбрать строку" "используя didSelectRowAt#
.)
Еще один момент, на который следует обратить внимание: это не работает, когда UITableView
находится в режиме редактирования. Чтобы ограничить выбор ячеек в режиме редактирования, используйте код как показано ниже:
tableView.allowsSelectionDuringEditing = false
Ответ 2
Все, что вам нужно сделать, это установить стиль выделения для экземпляра UITableViewCell
используя либо:
Objective-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
или же
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Свифт 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Свифт 3 и 4.х:
cell.selectionStyle = .none
Кроме того, убедитесь, что вы либо не внедрили -tableView:didSelectRowAtIndexPath:
в свой делегат табличного представления, либо явно исключите ячейки, для которых вы хотите, чтобы у вас не было никаких действий, если вы их реализуете.
Больше информации здесь и здесь
Ответ 3
Поскольку я недавно прочитал этот пост и помог мне, я хотел опубликовать еще один ответ, чтобы объединить все ответы (для потомков).
Итак, на самом деле существует 5 разных ответов в зависимости от вашей желаемой логики и/или результата:
1.Чтобы отключить синюю подсветку без изменения какого-либо другого взаимодействия ячейки:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Я использую это, когда у меня есть UIButton или какой-либо другой элемент управления (ы), размещенный в UITableViewCell, и я хочу, чтобы пользователь мог взаимодействовать с элементами управления, но не с самой ячейкой.
ПРИМЕЧАНИЕ. Как отметил Тони Миллион, это не предотвращает tableView:didSelectRowAtIndexPath:
. Я обойду это простыми утверждениями "если", чаще всего проверяя раздел и избегая действий для определенного раздела.Суб >
Еще один способ, который я решил проверить для прослушивания ячейки, как это:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// A case was selected, so push into the CaseDetailViewController
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.selectionStyle != UITableViewCellSelectionStyleNone) {
// Handle tap code here
}
}
2.Чтобы сделать это для всей таблицы, вы можете применить вышеуказанное решение к каждой ячейке в таблице, но вы также можете сделать это:
[tableView setAllowsSelection:NO];
В моем тестировании это все еще позволяет интерактивным элементам управления внутри UITableViewCell
.
3. Чтобы сделать ячейку "только для чтения", вы можете просто сделать это:
[cell setUserInteractionEnabled:NO];
4. Чтобы сделать всю таблицу "только для чтения"
[tableView setUserInteractionEnabled:NO];
5.Чтобы определить на лету ли выделение ячейки (которая в соответствии с этим ответом подразумевает выбор), вы можете реализовать следующий метод протокола UITableViewDelegate
:
- (BOOL)tableView:(UITableView *)tableView
shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
Ответ 4
Подводя итог тому, что я считаю правильным, основываясь на моем собственном опыте в реализации этого:
Если вы хотите отключить выбор только для некоторых ячеек, используйте:
cell.userInteractionEnabled = NO;
Помимо предотвращения выбора, это также останавливает tableView: didSelectRowAtIndexPath: вызывается для ячеек, которые он установил. (Кредит отправляется Тони Миллиону за этот ответ, спасибо!)
Если у вас есть кнопки в ячейках, которые нужно щелкнуть, вам нужно:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
и вам также нужно игнорировать любые клики на ячейке в - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
.
Если вы хотите отключить выбор для всей таблицы, используйте:
tableView.allowsSelection = NO;
(Отклик на Пауло де Барроса, спасибо!)
Ответ 5
Начиная с iOS 6.0, UITableViewDelegate
имеет tableView:shouldHighlightRowAtIndexPath:
. (Читайте об этом в iOS Documentation.)
Этот метод позволяет отмечать определенные строки как неосведомленные (и неявно, не поддающиеся выбору), не изменяя стиль выбора ячейки, возиться с обработкой событий ячейки с помощью userInteractionEnabled = NO
или любых других описанных здесь методов.
Ответ 6
Вы также можете отключить выбор строки из самого построителя интерфейса, выбрав NoSelection
из параметра selection
(из свойств UITableView) в панели инспектора, как показано на рисунке ниже.
Ответ 7
ФИКСИРОВАННОЕ РЕШЕНИЕ ДЛЯ SWIFT 3
cell.selectionStyle = .none
Ответ 8
Если вы хотите, чтобы выбор только для вспышки, не остался в выбранном состоянии, вы можете позвонить в
didSelectRowAtIndexPath
следующее
[tableView deselectRowAtIndexPath:indexPath animated:YES];
чтобы он высвечивал выбранное состояние и возвращался.
Ответ 9
В случае, если кому-то понадобится ответить Swift:
cell.selectionStyle = .None
Ответ 10
В UITableViewCell
XIB в настройке Attribute Inspector установите значение Selection
в None
.
Ответ 11
Это то, что я использую, в cellForRowAtIndexPath
напишите этот код.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Ответ 12
Из протокола UITableViewDelegate
вы можете использовать метод willSelectRowAtIndexPath
и return nil
, если вы не хотите, чтобы строка была выбрана.
Таким же образом вы можете использовать метод willDeselectRowAtIndexPath
и return nil
, если вы не хотите, чтобы строка была отменена.
Ответ 13
1- Все, что вам нужно сделать, это установить стиль выделения для экземпляра UITableViewCell
используя либо:
Objective-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
или же
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Свифт 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Свифт 3:
cell.selectionStyle = .none
2 - Не реализовывать - tableView:didSelectRowAtIndexPath:
в вашем табличном представлении delegate
или явно исключать ячейки, которые вы хотите, чтобы не было никаких действий, если вы это реализуете.
3 - Далее, вы также можете сделать это из раскадровки. Щелкните ячейку табличного представления и в инспекторе атрибутов под ячейкой табличного представления измените раскрывающийся список рядом с "Выделением" на "Нет".
4 - Вы можете отключить подсветку ячейки таблицы, используя следующий код в (iOS) Xcode 9, Swift 4.0
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
cell.selectionStyle = .none
return cell
}
Ответ 14
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
Ответ 15
Попробуйте ввести:
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)
}
Ответ 16
Я тоже очень борется с этим, имея контроль над UITableViewCell
, который запрещает использование свойства userInteractionEnabled
. У меня есть статическая таблица с 3 ячейками для настроек, 2 с датами, 1 с переключателем вкл./Выкл. После игры в Storyboard/IB мне удалось сделать нижнюю часть неизбираемой, но когда вы ее нажимаете, выбор из одной из верхних строк исчезает. Вот образ WIP моих настроек UITableView:
Если вы коснетесь третьей строки, ничего не происходит, выбор останется во второй строке. Функциональность фактически является копией приложения Apple Calendar для добавления времени события.
Код на удивление совместим, вплоть до IOS2 =/:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
Это работает в сочетании с установкой стиля выделения на none, поэтому ячейка не мерцает при событиях со стрелкой
Ответ 17
Мы можем написать код типа
cell.selectionStyle = UITableViewCellSelectionStyleNone;
но когда пользовательская ячейка xib выше строки выдаст предупреждение в то время для
пользовательская ячейка xib
нам нужно установить стиль выбора None из конструктора интерфейса
Ответ 18
Вам просто нужно поместить этот код в cellForRowAtIndexPath
Чтобы отключить свойство выбора ячейки: (при нажатии на ячейку).
cell.selectionStyle = UITableViewCellSelectionStyle.None
Ответ 19
попробуйте это
cell.selectionStyle = UITableViewCellSelectionStyleNone;
и
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
и вы также можете установить стиль выбора с помощью interfacebuilder.
Ответ 20
Я использую это, что работает для меня.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Ответ 21
Хотя это лучшее и простое решение, позволяющее предотвратить отображение строки во время выбора
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Я хотел бы также предположить, что иногда полезно кратко показать, что строка выбрана, а затем отключена. Это предупреждает пользователей с подтверждением того, что они намеревались выбрать:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
Ответ 22
Чтобы отключить выделение UItableviewcell
cell.selectionStyle = UITableViewCellSelectionStyleNone;
И не должен позволять пользователю взаимодействовать с ячейкой.
cell.userInteractionEnabled = NO;
Ответ 23
Вы также можете установить цвет фона в Clear для достижения того же эффекта, что и UITableViewCellSelectionStyleNone
, если вы не хотите/не можете использовать UITableViewCellSelectionStyleNone
.
Вы бы использовали следующий код:
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
Это может ухудшить вашу производительность, поскольку вы добавляете дополнительный цветной вид в ячейку каждая.
Ответ 24
Вы можете использовать:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
в ячейке для строки по методу указателя пути вашего UITableView.
Также вы можете использовать:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
в методе didselectrowatindexpath метода tableview.
Ответ 25
Непосредственно отключить подсветку TableViewCell в раскадровке
Ответ 26
Вы можете использовать этот
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Ответ 27
Лучшим решением будет Создание стиля выбора Нет
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Однако здесь мы рассматриваем тот факт, что для выбранного состояния нет пользовательских изображений.
Ответ 28
Вы можете использовать....
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Ответ 29
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Ответ 30
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Счастливое кодирование!!!