Когда вы нажимаете на строку в UITableView
, строка выделяется и выбирается. Можно ли это отключить, так что нажатие строки ничего не делает?
Когда вы нажимаете на строку в UITableView
, строка выделяется и выбирается. Можно ли это отключить, так что нажатие строки ничего не делает?
Ответы:
Для меня следующее работало нормально:
tableView.allowsSelection = false
Это означает, что didSelectRowAt#
просто не будет работать. То есть прикосновение к ряду стола как таковое абсолютно ничего не даст. (И, следовательно, очевидно, никогда не будет выбранной анимации.)
(Обратите внимание, что если в ячейках у вас есть UIButton
или какие-либо другие элементы управления, конечно, эти элементы управления будут по-прежнему работать. Любые элементы управления, которые у вас есть в ячейке таблицы, полностью не связаны со способностью UITableView разрешить вам «выбирать строку» используя didSelectRowAt#
.)
Еще один момент, на который следует обратить внимание: это не работает, когда UITableView
находится в режиме редактирования. Чтобы ограничить выбор ячеек в режиме редактирования, используйте код как показано ниже:
tableView.allowsSelectionDuringEditing = false
selectionStyle
свойство для ячейки: cell.selectionStyle = UITableViewCellSelectionStyle.None
в Swift или cell.selectionStyle = UITableViewCellSelectionStyleNone
в Objective-C.
tableView.allowSelection = false
tableViewDidSelectRowAtIndexPath
ее, cell.selectionStyle = .None
желательно. Если вы не хотите, чтобы эта функция-делегат вызывалась (или имела текстовое поле в tableViewCell), или нет tableView.allowsSelection = false
.
Все, что вам нужно сделать, это установить стиль выделения для UITableViewCell
экземпляра, используя либо:
Objective-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
или
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Свифт 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Свифт 3 и 4.х:
cell.selectionStyle = .none
Кроме того, убедитесь, что вы либо не внедрили -tableView:didSelectRowAtIndexPath:
в свой делегат табличного представления, либо явно исключили ячейки, для которых вы не хотите выполнять никаких действий, если вы это реализуете.
Поскольку я недавно прочитал этот пост, и он мне помог, я хотел опубликовать еще один ответ, чтобы объединить все ответы (для потомков).
Итак, на самом деле есть 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
tableView:shouldHighlightRowAtIndexPath:
, который, как правило (не всегда), является моим предпочтительным подходом.
Подводя итог, я считаю, правильные ответы, основанные на моем собственном опыте в реализации этого:
Если вы хотите отключить выбор только для некоторых ячеек, используйте:
cell.userInteractionEnabled = NO;
Помимо предотвращения выбора, это также останавливает tableView: didSelectRowAtIndexPath: вызывается для ячеек, для которых он установлен. (Благодарю Тони Миллиона за этот ответ, спасибо!)
Если в ваших ячейках есть кнопки, на которые нужно нажать, вместо этого вам нужно:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
и вам также нужно игнорировать любые щелчки по ячейке в - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
.
Если вы хотите отключить выбор для всей таблицы, используйте:
tableView.allowsSelection = NO;
(Благодарю Пауло Де Барроса, спасибо!)
Начиная с iOS 6.0, UITableViewDelegate
имеет tableView:shouldHighlightRowAtIndexPath:
. (Читайте об этом в документации iOS .)
Этот метод позволяет пометить определенные строки как несущественные (и неявно, не выбираемые) без необходимости изменять стиль выбора ячейки, связываться с обработкой событий ячейки userInteractionEnabled = NO
или любыми другими методами, описанными здесь.
Вы также можете отключить выбор строки в самом конструкторе интерфейса, выбрав один NoSelection
из selection
параметров (свойств UITableView) на панели инспектора, как показано на рисунке ниже.
ФИКСИРОВАННОЕ РЕШЕНИЕ ДЛЯ SWIFT 3
cell.selectionStyle = .none
Если вы хотите, чтобы выделение только мигало, а не оставалось в выбранном состоянии, вы можете позвонить, в
didSelectRowAtIndexPath
последующий
[tableView deselectRowAtIndexPath:indexPath animated:YES];
поэтому он будет мигать выбранное состояние и вернуться.
Это то, что я использую, при cellForRowAtIndexPath
написании этого кода.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Из UITableViewDelegate
протокола вы можете использовать метод, willSelectRowAtIndexPath
и return nil
если вы не хотите, чтобы выбранная строка.
Таким же образом вы можете использовать willDeselectRowAtIndexPath
метод, и return nil
если вы не хотите отменять выделение строки.
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
}
Ниже фрагмент отключает подсветку, но также отключает вызов didSelectRowAtIndexPath
. Так что, если вы не реализуете, didSelectRowAtIndexPath
используйте метод ниже. Это должно быть добавлено при создании таблицы. Это будет работать на кнопках и UITextField
внутри ячейки.
self.tableView.allowsSelection = NO;
Ниже фрагмент отключает подсветку и не отключает вызов didSelectRowAtIndexPath
. Установите стиль выделения ячейки на Нет вcellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Ниже фрагмент отключить все в ячейке. Это отключит взаимодействие с buttons
, textfields
:
self.tableView.userInteractionEnabled = false;
Ниже приведены Swift
эквиваленты вышеуказанных Objective-C
решений:
Замена первого решения
self.tableView.allowsSelection = false
Замена второго раствора
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Замена третьего решения
self.tableView.userInteractionEnabled = false
Попробуйте набрать:
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)
}
Я тоже с этим боролся, контролируя UITableViewCell
запрет на использование userInteractionEnabled
собственности. У меня есть статическая таблица с 3 ячейками для настроек, 2 с датами, 1 с переключателем вкл / выкл. После игры в Storyboard / IB мне удалось сделать нижнюю одну невыбираемой, но при нажатии на нее выбор из одной из верхних строк исчезает. Вот WIP-изображение моих настроек UITableView:
Если коснуться 3-го ряда, то ничего не произойдет, выбор останется на втором ряду. Функциональность практически является копией экрана выбора времени добавления приложения Apple Calendar.
Код на удивление совместим, вплоть до IOS2 = /:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
Это работает в сочетании с установкой стиля выделения на none, поэтому ячейка не мерцает при событиях касания
Вы просто должны поместить этот код в cellForRowAtIndexPath
Чтобы отключить свойство выбора ячейки: (При прикосновении к ячейке).
cell.selectionStyle = UITableViewCellSelectionStyle.None
Я использую это, который работает для меня.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Хотя это лучшее и самое простое решение, чтобы ряд не отображал выделение во время выделения.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Я также хотел бы предложить, что иногда полезно кратко показать, что строка была выбрана, а затем отключить ее. Это предупреждает пользователей с подтверждением того, что они намеревались выбрать:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
Вы также можете установить цвет фона на Очистить, чтобы достичь того же эффекта, что UITableViewCellSelectionStyleNone
и в случае, если вы не хотите / не можете использоватьUITableViewCellSelectionStyleNone
.
Вы бы использовали код, подобный следующему:
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
Это может ухудшить вашу производительность, поскольку вы добавляете дополнительный цветной вид в каждую ячейку.
Ты можешь использовать :
cell.selectionStyle = UITableViewCellSelectionStyleNone;
в ячейке для строки в методе индекса пути вашего UITableView.
Также вы можете использовать:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
в табличном представлении сделайте выбор метода индекса.
cell.selectionStyle = UITableViewCellSelectionStyle.none
в Свифте 3.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Удачного кодирования !!!
selection
, и, конечно,highlighting
отключается с этим. Многие ответы с высоким рейтингом объясняют, какdisable selection
и не относится к отключениюhighlighting
. Чтобы отключить только подсветку используйтеcell.selectionStyle = .None
или перейдите наstoryboard / cell / Selection = None