30 ответов:
для меня, следующее работало отлично:
tableView.allowsSelection = NO;это значит
didSelectRowAt#просто не будет работать. То есть прикосновение к ряду стола, как таковому, абсолютно ничего не сделает. (И, следовательно, очевидно, что никогда не будет выбранной анимации.)(обратите внимание, что если на ячейках у вас есть
UIButtonили любые другие элементы управления, конечно, эти элементы управления будут работать. Любые элементы управления, которые у вас есть в ячейке таблицы, полностью не связаны с UITableView возможность разрешить вам "выбрать строку" с помощьюdidSelectRowAt#.)
все, что вам нужно сделать, это задать стиль выделения на
UITableViewCellэкземпляр с помощью:Цель-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;или
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];Swift 2:
cell.selectionStyle = UITableViewCellSelectionStyle.NoneSwift 3 и 4.x:
cell.selectionStyle = .noneдалее, убедитесь, что вы либо не реализуют
-tableView:didSelectRowAtIndexPath:в вашем представлении таблицы делегируйте или явно исключите ячейки, которые вы хотите не иметь действия, если вы его реализуете.
потому что я недавно прочитал этот пост, и это помогло мне, я хотел опубликовать еще один ответ, чтобы объединить все ответы (для потомков).
Итак, на самом деле есть 5 разных ответов в зависимости от вашей желаемой логики и/или результата:
1.To отключите синюю подсветку без изменения любого другого взаимодействия ячейки:
[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.To сделайте это для всей таблицы, вы можете применить вышеуказанное решение к каждой ячейке в таблице, но вы также можете сделать это:[tableView setAllowsSelection:NO];в моем тестировании это все еще позволяет управлять внутри
UITableViewCellчтобы быть интерактивным.
3.Чтобы сделать ячейку "только для чтения", вы можете просто сделать это:[cell setUserInteractionEnabled:NO];
4.To сделайте всю таблицу "только для чтения"[tableView setUserInteractionEnabled:NO];
5.To определите на лету, следует ли выделять ячейку (которая в соответствии с ответ неявно включает выделение), можно реализовать следующееUITableViewDelegateметод протокола:- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
чтобы подвести итог тому, что я считаю правильными ответами, основанными на моем собственном опыте реализации этого:
если вы хотите отключить выделение только для некоторых ячеек, используйте:
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 документация.)этот метод позволяет пометить определенные строки как unhighlightable (и неявно, неизбираемые) без необходимости изменять стиль выбора ячейки, возясь с обработкой событий ячейки с помощью
userInteractionEnabled = NO, или любые другие методы, описанные здесь.
вы также можете отключить выбор строки из самого построителя интерфейса, выбирая
NoSelectionсselectionопция (свойств UITableView) в панели инспектора, как показано на рисунке ниже
в случае, если кто-то нуждается в ответе за Свифт:
cell.selectionStyle = .None
Если вы хотите, чтобы выбор только мигал, а не оставался в выбранном состоянии, вы можете позвонить, в
didSelectRowAtIndexPathследующее
[tableView deselectRowAtIndexPath:indexPath animated:YES];Так он будет мигать выбранное состояние и вернуться.
С
UITableViewDelegateпротокол вы можете использовать методwillSelectRowAtIndexPathиreturn nilЕсли вы не хотите, чтобы строки выбраны.таким же образом вы можете использовать
willDeselectRowAtIndexPathспособ иreturn nilЕсли вы не хотите, чтобы строка была отменена.
вот что я использую:
cell.selectionStyle = UITableViewCellSelectionStyleNone;в cellForRowAtIndexPath напишите этот код.
попробуй типа:
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) }
Цель-C:
ниже фрагмент отключить подсветку, но он также отключить вызов
didSelectRowAtIndexPath. Так что если вы не реализуетеdidSelectRowAtIndexPathзатем используйте метод ниже. Это должно быть добавлено при создании таблицы. Это будет работать на кнопках иUITextFieldвнутри клетки, хотя.self.tableView.allowsSelection = NO;ниже фрагмент отключить подсветку и он не отключает вызов
didSelectRowAtIndexPath. Установите для стиля выделения ячейки значение нет вcellForRowAtIndexPathcell.selectionStyle = UITableViewCellSelectionStyleNone;ниже фрагмент отключить все на сотовый. Это отключит взаимодействие с
buttons,textfields:self.tableView.userInteractionEnabled = false;Swift:
ниже
Swiftэквивалент вышеObjective-Cрешения:
замена первого решения
self.tableView.allowsSelection = falseзамена второй Решение
cell?.selectionStyle = UITableViewCellSelectionStyle.Noneзамена третьего решения
self.tableView.userInteractionEnabled = false
я боролся с этим довольно-таки обильно тоже, имея контроль в моем
UITableViewCellзапрещено использованиеuserInteractionEnabledсобственность. У меня есть 3 ячейки статической таблицы для настроек, 2 с датами, 1 с выключателем включения/выключения. После игры в Storyboard / IB мне удалось сделать нижний не выбираемым, но когда вы нажимаете на него, выбор из одной из верхних строк исчезает. Вот НЗП изображение моих настроек UITableView:
Если вы нажмете на 3-й ряд ничего в любом случае, выбор останется на втором ряду. Функциональность практически является копией экрана выбора времени добавления событий приложения календаря Apple.
код удивительно совместим, вплоть до IOS2 =/:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row == 2) { return nil; } return indexPath; }это работает в сочетании с установкой стиля выбора в none, поэтому ячейка не мерцает при касании событий
мы можем написать код типа
cell.selectionStyle = UITableViewCellSelectionStyleNone;но когда у нас есть пользовательская ячейка xib строку предупредить в это время
пользовательская ячейка xib
нужно установить стиль выбора нет из конструктора интерфейса
вы просто должны поместить этот код в cellForRowAtIndexPath
отключить свойство выбора ячейки:(при нажатии на ячейку).
cell.selectionStyle = UITableViewCellSelectionStyle.None
попробуй такое
cell.selectionStyle = UITableViewCellSelectionStyleNone;и
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];и вы также можете установить стиль выбора с помощью interfacebuilder.
хотя это лучшее и самое простое решение, чтобы предотвратить строку от отображения подсветки во время выбора
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];Это может деградируют ваша производительность в качестве добавления дополнительно цвета просмотра на каждого ячейки.
чтобы отключить подсветку UItableviewcell
cell.selectionStyle = UITableViewCellSelectionStyleNone;и не должен позволять пользователю взаимодействовать с ячейкой.
cell.userInteractionEnabled = NO;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; [cell setSelected:NO animated:NO]; [cell setHighlighted:NO animated:NO];удачи в кодировании !!!
вы также можете сделать это в раскадровке. Щелкните ячейку табличного представления и в инспекторе атрибутов в разделе ячейка табличного представления измените раскрывающийся список рядом с пунктом выбор на нет.
быстрое решение с пользовательской ячейкой:
import Foundation class CustomTableViewCell: UITableViewCell { required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override init(style: UITableViewCellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) self.selectionStyle = UITableViewCellSelectionStyle.None } }
можно использовать selectionStyle свойство UITableViewCell
cell.selectionStyle = UITableViewCellSelectionStyleNone;или
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];кроме того, не реализуйте ниже делегат
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }Если вы создали Xib / раскадровка файл, то вы можете изменить setUserInteractionEnabled свойство TableView, чтобы нет, сняв его. Это сделает ваш tableview только для чтения.



Comments