Как я могу отключить выбор UITableView? - PullRequest
1152 голосов
/ 10 октября 2008

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

Ответы [ 36 ]

1914 голосов
/ 10 октября 2008

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

Objective-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

или

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Swift 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3 и 4.x:

cell.selectionStyle = .none

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

Подробнее здесь и здесь

553 голосов
/ 22 июля 2009

У меня нормально работало следующее:

tableView.allowsSelection = NO;

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

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

351 голосов
/ 10 июня 2011

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



Итак, на самом деле есть 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
82 голосов
/ 01 июня 2011

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

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

cell.userInteractionEnabled = NO;

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

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

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

tableView.allowsSelection = NO;

(Благодарю Пауло Де Барроса, спасибо!)

54 голосов
/ 01 ноября 2012

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

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

48 голосов
/ 25 апреля 2013

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

UITableView Inspector

45 голосов
/ 07 января 2017

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

cell.selectionStyle = .none
34 голосов
/ 02 декабря 2014

В случае, если кому-то нужен ответ за Swift :

cell.selectionStyle = .None
34 голосов
/ 13 ноября 2012

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

didSelectRowAtIndexPath

следующий

[tableView deselectRowAtIndexPath:indexPath animated:YES];

, поэтому он будет мигать в выбранном состоянии и возвращаться.

32 голосов
/ 05 октября 2016

В ваших UITableViewCell XIB в инспекторе атрибутов установлено значение Selection до None.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...