Когда вы нажимаете на строку в UITableView
, строка выделяется и выбирается. Можно ли это отключить, так что нажатие строки ничего не делает?
ios
uitableview
cocoa-touch
DavidM
источник
источник
selection
, и, конечно,highlighting
отключается с этим. Многие ответы с высоким рейтингом объясняют, какdisable selection
и не относится к отключениюhighlighting
. Чтобы отключить только подсветку используйтеcell.selectionStyle = .None
или перейдите наstoryboard / cell / Selection = None
Ответы:
Для меня следующее работало нормально:
Это означает, что
didSelectRowAt#
просто не будет работать. То есть прикосновение к ряду стола как таковое абсолютно ничего не даст. (И, следовательно, очевидно, никогда не будет выбранной анимации.)(Обратите внимание, что если в ячейках у вас есть
UIButton
или какие-либо другие элементы управления, конечно, эти элементы управления будут по-прежнему работать. Любые элементы управления, которые у вас есть в ячейке таблицы, полностью не связаны со способностью UITableView разрешить вам «выбирать строку» используяdidSelectRowAt#
.)Еще один момент, на который следует обратить внимание: это не работает, когда
UITableView
находится в режиме редактирования. Чтобы ограничить выбор ячеек в режиме редактирования, используйте код как показано ниже:источник
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:
или
Свифт 2:
Свифт 3 и 4.х:
Кроме того, убедитесь, что вы либо не внедрили
-tableView:didSelectRowAtIndexPath:
в свой делегат табличного представления, либо явно исключили ячейки, для которых вы не хотите выполнять никаких действий, если вы это реализуете.Больше информации здесь и здесь
источник
Поскольку я недавно прочитал этот пост, и он мне помог, я хотел опубликовать еще один ответ, чтобы объединить все ответы (для потомков).
Итак, на самом деле есть 5 разных ответов в зависимости от желаемой логики и / или результата:
1.Чтобы отключить синюю подсветку, не меняя других взаимодействий ячейки:
Я использую это, когда у меня есть UIButton - или некоторые другие элементы управления - размещенные в UITableViewCell, и я хочу, чтобы пользователь мог взаимодействовать с элементами управления, но не с самой ячейкой.
НОТА : как отметил Тони Миллион выше, это НЕ мешает
tableView:didSelectRowAtIndexPath:
. Я обхожу это с помощью простых «если» утверждений, чаще всего проверяя раздел и избегая действий для конкретного раздела.Другой способ, которым я подумал проверить на постукивание по ячейке:
2. Чтобы сделать это для всей таблицы, вы можете применить вышеуказанное решение к каждой ячейке таблицы, но вы также можете сделать это:
В моем тестировании это все еще позволяет элементам управления
UITableViewCell
быть интерактивными.3. Чтобы сделать ячейку доступной только для чтения, вы можете просто сделать это:
4. Сделать всю таблицу «только для чтения»
5. Чтобы на лету определить, следует ли выделять ячейку (которая в соответствии с этим ответом подразумевает выбор), вы можете реализовать следующий
UITableViewDelegate
метод протокола:источник
tableView:shouldHighlightRowAtIndexPath:
, который, как правило (не всегда), является моим предпочтительным подходом.Подводя итог, я считаю, правильные ответы, основанные на моем собственном опыте в реализации этого:
Если вы хотите отключить выбор только для некоторых ячеек, используйте:
Помимо предотвращения выбора, это также останавливает tableView: didSelectRowAtIndexPath: вызывается для ячеек, для которых он установлен. (Благодарю Тони Миллиона за этот ответ, спасибо!)
Если в ваших ячейках есть кнопки, на которые нужно нажать, вместо этого вам нужно:
и вам также нужно игнорировать любые щелчки по ячейке в
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
.Если вы хотите отключить выбор для всей таблицы, используйте:
(Благодарю Пауло Де Барроса, спасибо!)
источник
Начиная с iOS 6.0,
UITableViewDelegate
имеетtableView:shouldHighlightRowAtIndexPath:
. (Читайте об этом в документации iOS .)Этот метод позволяет пометить определенные строки как несущественные (и неявно, не выбираемые) без необходимости изменять стиль выбора ячейки, связываться с обработкой событий ячейки
userInteractionEnabled = NO
или любыми другими методами, описанными здесь.источник
Вы также можете отключить выбор строки в самом конструкторе интерфейса, выбрав один
NoSelection
изselection
параметров (свойств UITableView) на панели инспектора, как показано на рисунке ниже.источник
ФИКСИРОВАННОЕ РЕШЕНИЕ ДЛЯ SWIFT 3
источник
В вашем
UITableViewCell
«s XIB в Attribute Inspector установленное значениеSelection
дляNone
.источник
Если вы хотите, чтобы выделение только мигало, а не оставалось в выбранном состоянии, вы можете позвонить, в
последующий
поэтому он будет мигать выбранное состояние и вернуться.
источник
В случае, если кому-то нужен ответ для Swift :
источник
Это то, что я использую, при
cellForRowAtIndexPath
написании этого кода.источник
Из
UITableViewDelegate
протокола вы можете использовать метод,willSelectRowAtIndexPath
иreturn nil
если вы не хотите, чтобы выбранная строка.Таким же образом вы можете использовать
willDeselectRowAtIndexPath
метод, иreturn nil
если вы не хотите отменять выделение строки.источник
1- Все, что вам нужно сделать, это установить стиль выделения для
UITableViewCell
экземпляра, используя либо:Objective-C:
или
Свифт 2:
Свифт 3:
2 - Не реализовывать -
tableView:didSelectRowAtIndexPath:
в вашем табличном представленииdelegate
или явно исключите ячейки, которые вы не хотите выполнять, если вы реализуете это.3 - Далее, вы также можете сделать это из раскадровки. Щелкните ячейку табличного представления и в инспекторе атрибутов под ячейкой табличного представления измените раскрывающийся список рядом с «Выделением» на «Нет».
4 - Вы можете отключить подсветку ячейки таблицы, используя следующий код в (iOS) Xcode 9, Swift 4.0
источник
Objective-C:
Ниже фрагмент отключает подсветку, но также отключает вызов
didSelectRowAtIndexPath
. Так что, если вы не реализуете,didSelectRowAtIndexPath
используйте метод ниже. Это должно быть добавлено при создании таблицы. Это будет работать на кнопках иUITextField
внутри ячейки.Ниже фрагмент отключает подсветку и не отключает вызов
didSelectRowAtIndexPath
. Установите стиль выделения ячейки на Нет вcellForRowAtIndexPath
Ниже фрагмент отключить все в ячейке. Это отключит взаимодействие с
buttons
,textfields
:Swift:
Ниже приведены
Swift
эквиваленты вышеуказанныхObjective-C
решений:Замена первого решения
Замена второго раствора
Замена третьего решения
источник
Попробуйте набрать:
Это отменит ваш ряд, когда это необходимо.
В Swift3 ...
источник
Я тоже с этим боролся, контролируя
UITableViewCell
запрет на использованиеuserInteractionEnabled
собственности. У меня есть статическая таблица с 3 ячейками для настроек, 2 с датами, 1 с переключателем вкл / выкл. После игры в Storyboard / IB мне удалось сделать нижнюю одну невыбираемой, но при нажатии на нее выбор из одной из верхних строк исчезает. Вот WIP-изображение моих настроек UITableView:Если коснуться 3-го ряда, то ничего не произойдет, выбор останется на втором ряду. Функциональность практически является копией экрана выбора времени добавления приложения Apple Calendar.
Код на удивление совместим, вплоть до IOS2 = /:
Это работает в сочетании с установкой стиля выделения на none, поэтому ячейка не мерцает при событиях касания
источник
Мы можем написать код, как
но когда у нас есть пользовательская ячейка Xib над строкой, выдают предупреждение в то время
пользовательская ячейка XIB
нам нужно установить стиль выбора None от разработчика интерфейса
источник
Вы просто должны поместить этот код в cellForRowAtIndexPath
Чтобы отключить свойство выбора ячейки: (При прикосновении к ячейке).
источник
попробуй это
а также
и вы также можете установить стиль выбора с помощью Interface Builder.
источник
Я использую это, который работает для меня.
источник
Хотя это лучшее и самое простое решение, чтобы ряд не отображал выделение во время выделения.
Я также хотел бы предложить, что иногда полезно кратко показать, что строка была выбрана, а затем отключить ее. Это предупреждает пользователей с подтверждением того, что они намеревались выбрать:
источник
Непосредственно отключить подсветку TableViewCell в раскадровке
источник
Чтобы отключить подсветку UItableviewcell
И не должен позволять пользователю взаимодействовать с клеткой.
источник
Вы также можете установить цвет фона на Очистить, чтобы достичь того же эффекта, что
UITableViewCellSelectionStyleNone
и в случае, если вы не хотите / не можете использоватьUITableViewCellSelectionStyleNone
.Вы бы использовали код, подобный следующему:
Это может ухудшить вашу производительность, поскольку вы добавляете дополнительный цветной вид в каждую ячейку.
источник
Ты можешь использовать :
в ячейке для строки в методе индекса пути вашего UITableView.
Также вы можете использовать:
в табличном представлении сделайте выбор метода индекса.
источник
cell.selectionStyle = UITableViewCellSelectionStyle.none
в Свифте 3.Вы можете использовать это
источник
Ты можешь использовать ....
источник
источник
Удачного кодирования !!!
источник
Вы также можете сделать это из раскадровки. Щелкните ячейку табличного представления и в инспекторе атрибутов под ячейкой табличного представления измените раскрывающийся список рядом с «Выделением» на «Нет».
источник