Как я могу отключить выбор UITableView?

1118

Когда вы нажимаете строку в UITableView, строка подсвечивается и выбирается. Можно ли отключить это, поэтому нажатие строки ничего не делает?

  • 5
    Оригинальный вопрос имеет плохое название. OP хочет в первую очередь отключить selection , и, конечно, highlighting отключается. Многие ответы с высоким рейтингом объясняют, как disable selection и не относятся к отключению highlighting . Чтобы отключить только выделение, используйте cell.selectionStyle = .None или перейдите в storyboard / cell / Selection = None
  • 0
    Пожалуйста, обновите заголовок или пост. Я не совсем понимаю. И, основываясь на этом вопросе, я понятия не имею, для чего предназначены ответы.
Теги:
uitableview
cocoa-touch
highlight

36 ответов

530
Лучший ответ

Для меня было выполнено следующее:

tableView.allowsSelection = NO;

Это означает, что didSelectRowAt# просто не будет работать. То есть прикосновение к ряду таблицы, как таковое, ничего не сделает. (И, следовательно, очевидно, что никогда не будет выбранной анимации.)

(Обратите внимание: если на ячейках у вас есть UIButton или любые другие элементы управления, конечно, эти элементы управления будут по-прежнему работать. Любые элементы управления, которые у вас есть на ячейке таблицы, полностью не связаны с возможностью UITableView, позволяющей вам "выбрать строку" с помощью didSelectRowAt#.)

  • 6
    это, наконец, сработало для меня, я попытался использовать cell.selectionStyle = UITableViewCellSelectionStyleNone; но это не сработало. Стоит отметить: это должно быть: tableView.allowsSelection = NO; не ложь
  • 6
    Я думаю, это лучший вариант. При этом кнопки на ячейках активны, но текст неактивен.
Показать ещё 12 комментариев
1887

Все, что вам нужно сделать, это установить стиль выделения для экземпляра UITableViewCell используя либо:

Objective-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

или же

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Свифт 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Свифт 3 и 4.х:

cell.selectionStyle = .none

Кроме того, убедитесь, что вы либо не внедрили -tableView:didSelectRowAtIndexPath: в свой делегат табличного представления, либо явно исключите ячейки, для которых вы хотите, чтобы у вас не было никаких действий, если вы их реализуете.

Больше информации здесь и здесь

  • 312
    ARRRRRRRGH лучший способ сделать это - использовать cell.userInteractionEnabled = NO; который не только ОСТАНОВИТ подсвечиваемую ячейку, но и остановит эту конкретную ячейку, вызывая didSelectRowAtIndexPath .........
  • 3
    @ Тони Это работает очень хорошо, спасибо! Как насчет размещения его в качестве ответа, чтобы мы могли поднять его до вершины?
Показать ещё 17 комментариев
340

Поскольку я недавно прочитал этот пост и помог мне, я хотел опубликовать еще один ответ, чтобы объединить все ответы (для потомков).



Итак, на самом деле существует 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
  • 3
    Если вы загрузите дизайн ячейки из пера, флажок (в IB) будет отлично работать для # 3 (и для таблиц для # 4). Для № 4 против № 2, разница в том, будут ли элементы управления внутри ячейки интерактивными?
  • 4
    Да. Если вы хотите отключить выбор, но разрешить UIButtons и т. Д. Продолжать поддерживать взаимодействие с пользователем, используйте # 2. Если вы хотите полностью доступную только для чтения ячейку, используйте # 4. Конечно, почему вы не имеете ничего, кроме UIViews или UILabels в неинтерактивной ячейке, мне не понятно. Может быть, кто-то захочет отключить все взаимодействия, пока происходит что-то еще.
Показать ещё 7 комментариев
78

Подводя итог тому, что я считаю правильным, основываясь на моем собственном опыте в реализации этого:

Если вы хотите отключить выбор только для некоторых ячеек, используйте:

cell.userInteractionEnabled = NO;

Помимо предотвращения выбора, это также останавливает tableView: didSelectRowAtIndexPath: вызывается для ячеек, которые он установил. (Кредит отправляется Тони Миллиону за этот ответ, спасибо!)

Если у вас есть кнопки в ячейках, которые нужно щелкнуть, вам нужно:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

и вам также нужно игнорировать любые клики на ячейке в - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath.

Если вы хотите отключить выбор для всей таблицы, используйте:

tableView.allowsSelection = NO;

(Отклик на Пауло де Барроса, спасибо!)

  • 0
    Что делать, если у нас есть кнопка в нашей клетке?
50

Начиная с iOS 6.0, UITableViewDelegate имеет tableView:shouldHighlightRowAtIndexPath:. (Читайте об этом в iOS Documentation.)

Этот метод позволяет отмечать определенные строки как неосведомленные (и неявно, не поддающиеся выбору), не изменяя стиль выбора ячейки, возиться с обработкой событий ячейки с помощью userInteractionEnabled = NO или любых других описанных здесь методов.

  • 1
    Наткнулся на эту ветку, и я был шокирован, увидев так много других ответов до этого. Это, без сомнения, правильный путь.
  • 1
    Это действительно правильный и единственный ответ, который следует учитывать. Все остальное, упоминающее userInteraction, совершенно неверно.
47

Вы также можете отключить выбор строки из самого построителя интерфейса, выбрав NoSelection из параметра selection (из свойств UITableView) в панели инспектора, как показано на рисунке ниже.

Изображение 5173

  • 2
    Лучшее решение ИМХО
  • 0
    Я часто использую это решение
41

ФИКСИРОВАННОЕ РЕШЕНИЕ ДЛЯ SWIFT 3

cell.selectionStyle = .none
  • 0
    это кажется гораздо лучшим ответом, чем выбранный ...
34

В случае, если кому-то понадобится ответить Swift:

cell.selectionStyle = .None
  • 1
    мы также можем использовать этот cell.selectionStyle = UITableViewCellSelectionStyle.None
33

Если вы хотите, чтобы выбор только для вспышки, не остался в выбранном состоянии, вы можете позвонить в

didSelectRowAtIndexPath

следующее

[tableView deselectRowAtIndexPath:indexPath animated:YES];

чтобы он высвечивал выбранное состояние и возвращался.

  • 3
    При таком подходе строка мгновенно подсвечивается, а затем затухает в течение полсекунды. Так Apple разрабатывает свои меню настроек, так что мне это нравится.
30

В UITableViewCell XIB в настройке Attribute Inspector установите значение Selection в None.

Изображение 5174

  • 1
    Почему голосование без объяснения причин?
  • 0
    Это именно то, что мне было нужно. Я все еще хотел уведомление didSelect ..., но без видимой индикации выбора. Спасибо!
Показать ещё 1 комментарий
27

Это то, что я использую, в cellForRowAtIndexPath напишите этот код.

cell.selectionStyle = UITableViewCellSelectionStyleNone;
27

Из протокола UITableViewDelegate вы можете использовать метод willSelectRowAtIndexPath и return nil, если вы не хотите, чтобы строка была выбрана.

Таким же образом вы можете использовать метод willDeselectRowAtIndexPath и return nil, если вы не хотите, чтобы строка была отменена.

  • 4
    Мне не нравится этот метод, потому что он все еще показывает ячейку в подсвеченном состоянии, пока не подправится.
  • 2
    именно поэтому мне это нравится :-)
20

Objective-C:

  1. Ниже фрагмент отключает подсветку, но также отключает вызов didSelectRowAtIndexPath. Так что, если вы не реализуете didSelectRowAtIndexPath используйте метод ниже. Это следует добавить при создании таблицы. Это будет работать с кнопками и UITextField внутри ячейки.

    self.tableView.allowsSelection = NO;
    
  2. Ниже фрагмент отключает подсветку и не отключает вызов didSelectRowAtIndexPath. Установите стиль выделения ячейки на None в cellForRowAtIndexPath

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
  3. Ниже фрагмент отключить все в ячейке. Это отключит взаимодействие с buttons, textfields:

    self.tableView.userInteractionEnabled = false;
    

Swift:

Ниже приведен Swift эквивалент вышеуказанных решений Objective-C:

  1. Замена первого решения

    self.tableView.allowsSelection = false
    
  2. Замена второго раствора

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
    
  3. Замена третьего решения

    self.tableView.userInteractionEnabled = false
    
18

Попробуйте ввести:

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)
}
13

Я тоже очень борется с этим, имея контроль над UITableViewCell, который запрещает использование свойства userInteractionEnabled. У меня есть статическая таблица с 3 ячейками для настроек, 2 с датами, 1 с переключателем вкл./Выкл. После игры в Storyboard/IB мне удалось сделать нижнюю часть неизбираемой, но когда вы ее нажимаете, выбор из одной из верхних строк исчезает. Вот образ WIP моих настроек UITableView:

Изображение 5175

Если вы коснетесь третьей строки, ничего не происходит, выбор останется во второй строке. Функциональность фактически является копией приложения Apple Calendar для добавления времени события.

Код на удивление совместим, вплоть до IOS2 =/:

- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == 2) {
        return nil;
    }
    return indexPath;
}

Это работает в сочетании с установкой стиля выделения на none, поэтому ячейка не мерцает при событиях со стрелкой

12

1- Все, что вам нужно сделать, это установить стиль выделения для экземпляра UITableViewCell, используя либо:


Objective-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

или же

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];


Свифт 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None


Свифт 3:

cell.selectionStyle = .none


2 - Не реализовывать - tableView: didSelectRowAtIndexPath: в вашем табличном представлении делегировать или явно исключать ячейки, для которых вы хотите, чтобы у вас не было никаких действий, если вы это реализуете.

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


}
10

Вам просто нужно поместить этот код в cellForRowAtIndexPath

Чтобы отключить свойство выбора ячейки: (при нажатии на ячейку).

cell.selectionStyle = UITableViewCellSelectionStyle.None
  • 0
    Спасибо, у меня есть изображение в моей камере и ярлык над ней. Я установил фон метки, но каждый раз, когда я нажимал, фон исчезал, это решало его.
10

Мы можем написать код типа

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

но когда пользовательская ячейка xib выше строки выдаст предупреждение в то время для

пользовательская ячейка xib

нам нужно установить стиль выбора None из конструктора интерфейса

9

Я использую это, что работает для меня.

cell?.selectionStyle = UITableViewCellSelectionStyle.None
9

попробуйте это

cell.selectionStyle = UITableViewCellSelectionStyleNone;

и

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

и вы также можете установить стиль выбора с помощью interfacebuilder.

7

Хотя это лучшее и простое решение, позволяющее предотвратить отображение строки во время выбора

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Я хотел бы также предположить, что иногда полезно кратко показать, что строка выбрана, а затем отключена. Это предупреждает пользователей с подтверждением того, что они намеревались выбрать:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     [tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
6

Непосредственно отключить подсветку TableViewCell в раскадровке

Изображение 5176

6

Вы также можете установить цвет фона в Clear для достижения того же эффекта, что и UITableViewCellSelectionStyleNone, если вы не хотите/не можете использовать UITableViewCellSelectionStyleNone.

Вы бы использовали следующий код:

UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];

Это может ухудшить вашу производительность, поскольку вы добавляете дополнительный цветной вид в ячейку каждая.

5

Вы можете использовать свойство selectionStyle для UITableViewCell

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

Или

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Кроме того, не выполняйте ниже делегата

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }

Если вы создали файл Xib/Storyboard, вы можете изменить setUserInteractionEnabled свойство tableview to No, сняв флажок. Это сделает ваше представление таблицы только для чтения.

5

Быстрое решение с пользовательской ячейкой:

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
  } 
}
5

Вы также можете сделать это из раскадровки. Щелкните ячейку просмотра таблицы и в инспекторе атрибутов в ячейке "Просмотр таблицы", измените раскрывающийся список ниже "Выбор" на "Нет".

5
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];

Счастливое кодирование!!!

5

Вы можете использовать:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

в ячейке для строки по методу указателя пути вашего UITableView.

Также вы можете использовать:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

в методе didselectrowatindexpath метода tableview.

  • 0
    Это теперь cell.selectionStyle = UITableViewCellSelectionStyle.none в Swift 3.
5
cell.selectionStyle = UITableViewCellSelectionStyleNone;
5

Вы можете использовать....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
5

Вы можете использовать этот

cell.selectionStyle = UITableViewCellSelectionStyleNone;
5

Чтобы отключить выделение UItableviewcell

cell.selectionStyle = UITableViewCellSelectionStyleNone;

И не должен позволять пользователю взаимодействовать с ячейкой.

cell.userInteractionEnabled = NO;
4

Лучшим решением будет Создание стиля выбора Нет

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Однако здесь мы рассматриваем тот факт, что для выбранного состояния нет пользовательских изображений.

1

Как минимум, с iOS 6 вы можете переопределить методы в своей пользовательской ячейке, чтобы предотвратить синюю подсветку. Никакое другое взаимодействие не отключено или не затронуто. Все три должны быть переопределены.

- (void) setHighlighted:(BOOL)highlighted
{
}

- (void) setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
}

- (void) setSelected:(BOOL)selected animated:(BOOL)animated
{
}
1

Лучшим подходом будет:

cell.userInteractionEnabled = NO;

Этот метод не будет вызывать метод didSelectRowAtIndexPath:.

0

Вы можете отключить подсветку ячейки таблицы, используя приведенный ниже код в (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


}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню