Как отключить выделение выделения UITableView?

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

1001
задан DavidM 10 окт. '08 в 14:32
источник поделиться
34 ответов
  • 1
  • 2

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

tableView.allowsSelection = NO;

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

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

458
ответ дан Paulo De Barros 22 июля '09 в 19:56
источник поделиться

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

Objective-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

или

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Swift 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3:

cell.selectionStyle = .none

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

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

1719
ответ дан Martin Gordon 10 окт. '08 в 16:22
источник поделиться

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



Итак, на самом деле существует 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
325
ответ дан mbm29414 10 июня '11 в 14:08
источник поделиться

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

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

cell.userInteractionEnabled = NO;

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

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

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

tableView.allowsSelection = NO;

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

66
ответ дан JosephH 01 июня '11 в 16:32
источник поделиться

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

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

45
ответ дан cbowns 01 нояб. '12 в 0:48
источник поделиться

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

UITableView Inspector

39
ответ дан vignesh kumar 25 апр. '13 в 16:13
источник поделиться

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

cell.selectionStyle = .None
31
ответ дан Aks 02 дек. '14 в 12:39
источник поделиться

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

cell.selectionStyle = .none
28
ответ дан MANISH PATHAK 07 янв. '17 в 22:15
источник поделиться

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

didSelectRowAtIndexPath

следующее

[tableView deselectRowAtIndexPath:indexPath animated:YES];

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

27
ответ дан Chris Fox 13 нояб. '12 в 18:07
источник поделиться

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

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

23
ответ дан user41806 30 июня '09 в 13:01
источник поделиться

Это то, что я использую:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

в cellForRowAtIndexPath напишите этот код.

20
ответ дан Ahsan Ebrahim 30 марта '15 в 13:31
источник поделиться

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

введите описание изображения здесь

20
ответ дан Zaid Pathan 05 окт. '16 в 10:49
источник поделиться

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

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)
}
12
ответ дан wzbozon 27 мая '11 в 18:37
источник поделиться

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

Settings UITableView

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

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

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

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

11
ответ дан Yarek T 04 янв. '13 в 0:08
источник поделиться

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

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

cell.selectionStyle = UITableViewCellSelectionStyle.None
10
ответ дан Gaurav Patel 18 мая '16 в 8:17
источник поделиться

Цель C:

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

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

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

    self.tableView.userInteractionEnabled = false;
    

Свифта

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

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

    self.tableView.allowsSelection = false
    
  • Замена второго решения

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

    self.tableView.userInteractionEnabled = false
    
10
ответ дан Arun Gupta 22 нояб. '14 в 12:43
источник поделиться

для быстрого отмена выбора

cell.selectionStyle = .None
10
ответ дан parvind 30 марта '15 в 9:10
источник поделиться

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

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

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

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

9
ответ дан iDhaval 24 марта '12 в 16:21
источник поделиться

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

cell?.selectionStyle = UITableViewCellSelectionStyle.None
8
ответ дан priyanka gautam 19 окт. '15 в 15:33
источник поделиться

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

и

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

8
ответ дан v_1 09 июля '12 в 10:27
источник поделиться

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     [tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
6
ответ дан Steve Barden 21 авг. '13 в 0:25
источник поделиться

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

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

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

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

5
ответ дан virindh 14 янв. '14 в 4:43
источник поделиться

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

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

Или

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

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

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

4
ответ дан Jayprakash Dubey 15 мая '15 в 11:55
источник поделиться

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

4
ответ дан Cindy 04 дек. '14 в 8:12
источник поделиться
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];

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

4
ответ дан Rinku Sadhwani 31 июля '14 в 15:53
источник поделиться

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;
4
ответ дан iEinstein 10 мая '13 в 12:44
источник поделиться

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

cell.userInteractionEnabled = NO;
4
ответ дан Sharme 18 янв. '13 в 3:51
источник поделиться

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
4
ответ дан Mohan Chaudhari 08 окт. '13 в 14:10
источник поделиться

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

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
  } 
}
4
ответ дан Zorayr 19 февр. '15 в 11:54
источник поделиться

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

3
ответ дан Sunny 25 авг. '13 в 16:24
источник поделиться
  • 1
  • 2

Другие вопросы по меткам