При нажатии строки в UITableView
строка выделяется и выделяется. Можно ли отключить это, так что нажатие строки ничего не делает?
При нажатии строки в UITableView
строка выделяется и выделяется. Можно ли отключить это, так что нажатие строки ничего не делает?
Все, что вам нужно сделать, это установить стиль выделения для экземпляра UITableViewCell
, используя либо:
Цель-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
или
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3 и 4. х:
cell.selectionStyle = .none
Кроме того, убедитесь, что вы либо не внедрили -tableView:didSelectRowAtIndexPath:
в свой делегат табличного представления, либо явно исключили ячейки, для которых вы хотите, чтобы у вас не было никаких действий, если вы их реализуете.
У меня нормально работало следующее:
tableView.allowsSelection = NO;
Это означает, что didSelectRowAt#
просто не будет работать. То есть прикосновение к ряду стола как таковое абсолютно ничего не даст. (И следовательно, очевидно, никогда не будет выбранной анимации. )
(Обратите внимание, что если в ячейках у вас есть UIButton
или какие-либо другие элементы управления, конечно, эти элементы все еще будут работать. Любые элементы управления, которые у вас есть в ячейке таблицы, совершенно не связаны со способностью UITableView позволить вам «выбрать строку» с помощью didSelectRowAt#
. )
Поскольку я недавно прочитал этот пост и он мне помог, я хотел опубликовать еще один ответ, чтобы объединить все ответы (для потомков).
Итак, на самом деле есть 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
Подводя итог, я считаю, правильные ответы, основанные на моем собственном опыте в реализации этого:
Если вы хотите отключить выделение только для некоторых ячеек, используйте:
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
В случае, если кому-то нужен ответ для Swift :
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)
}
Ниже фрагмент отключает подсветку, но также отключает вызов 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
Я тоже с этим боролся, потому что в моем 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, поэтому ячейка не мерцает при событиях приземления.
для быстрого отмены выбора
cell.selectionStyle = .None
Вам просто нужно поместить этот код в cellForRowAtIndexPath
Чтобы отключить свойство выбора ячейки: (При прикосновении к ячейке).
cell.selectionStyle = UITableViewCellSelectionStyle.None
Мы можем написать код, как
cell.selectionStyle = UITableViewCellSelectionStyleNone;
, но когда у нас есть , пользовательская ячейка xib над строкой выдает предупреждение в то время для
пользовательская ячейка XIB
нам нужно установить стиль выбора None от построителя интерфейса
Я использую это, который работает для меня.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
попробуйте это
cell.selectionStyle = UITableViewCellSelectionStyleNone;
и
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
, и вы также можете установить стиль выделения с помощью Interface Builder.
Хотя это лучшее и самое простое решение, чтобы ряд не отображал выделение во время выделения
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];
Это может ухудшить вашей производительности, поскольку вы добавляете дополнительных цветных представлений к каждой ячейке .
Вы можете использовать selectionStyle свойство UITableViewCell
cell.selectionStyle = UITableViewCellSelectionStyleNone;
или
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Также, не реализуйте ниже делегат
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }
Если вы создали файл Xib / Storyboard, вы можете изменить setUserInteractionEnabled свойство таблицы к № , сняв отметку. Это сделает ваш просмотр таблицы только для чтения.
Чтобы отключить выделение UItableviewcell
cell.selectionStyle = UITableViewCellSelectionStyleNone;
И не должен позволять пользователю взаимодействовать с ячейкой.
cell.userInteractionEnabled = NO;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Удачного кодирования! ! !
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Вы можете использовать. , , ,
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift Solution с пользовательской ячейкой:
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
}
}
Вы можете использовать это
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Вы также можете сделать это из раскадровки. Щелкните ячейку табличного представления и в инспекторе атрибутов в разделе «Ячейка табличного представления» измените раскрывающийся список рядом с «Выделением» на «Нет».
Вы можете использовать:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
в ячейке для строки в методе индекса пути вашего UITableView.
Также вы можете использовать:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
в табличном представлении сделайте выбор метода индекса.
Лучшим решением было бы Создание стиля выбора Нет
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Однако, здесь мы рассматриваем тот факт, что нет никаких пользовательских изображений, используемых для выбранного состояния.
Лучшим подходом будет:
cell.userInteractionEnabled = NO;
Этот подход не вызовет метод didSelectRowAtIndexPath:
.
По крайней мере, начиная с iOS 6, вы можете переопределить методы в своей пользовательской ячейке, чтобы предотвратить выделение синим цветом. Никакое другое взаимодействие не отключено или не затронуто. Все три должны быть отменены.
- (void) setHighlighted:(BOOL)highlighted
{
}
- (void) setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
}
- (void) setSelected:(BOOL)selected animated:(BOOL)animated
{
}
Вы можете отключить подсветку ячейки таблицы, используя код ниже (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
}