it-swarm.com.ru

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

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

1155
DavidM

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

tableView.allowsSelection = NO;

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

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

556
Paulo De Barros

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

Objective-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

или же

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Свифт 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Свифт 3 и 4.х:

cell.selectionStyle = .none

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

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

1917
Martin Gordon

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



Итак, на самом деле есть 5 разных ответов в зависимости от желаемой логики и/или результата:

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Я использую это, когда у меня есть UIButton - или некоторые другие элементы управления - размещенные в UITableViewCell, и я хочу, чтобы пользователь мог взаимодействовать с элементами управления, но не с самой ячейкой.

NOTE: как отметил Тони Миллион выше, это НЕ мешает 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
351
mbm29414

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

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

cell.userInteractionEnabled = NO;

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

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

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

tableView.allowsSelection = NO;

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

82
JosephH

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

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

54
cbowns

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

UITableView Inspector

48
vignesh kumar

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

cell.selectionStyle = .none
45
MANISH PATHAK

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

cell.selectionStyle = .None
34
Aks

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

didSelectRowAtIndexPath

следующие

[tableView deselectRowAtIndexPath:indexPath animated:YES];

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

34
Chris Fox

В вашем UITableViewCellXIB в инспекторе атрибутов установите значение Selection равным None.

enter image description here

32
Zaid Pathan

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;
29
Ahsan Ebrahim

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

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

28
user41806

Objective-C:

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

    self.tableView.allowsSelection = NO;
    
  2. Ниже фрагмент отключает подсветку и не отключает вызов didSelectRowAtIndexPath. Установите стиль выделения ячейки Нет в 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
    
20
Arun Gupta

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


[. .____] Objective-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

или же

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];


Swift 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None


Swift 3:

cell.selectionStyle = .none


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

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


4 - Вы можете отключить подсветку ячейки таблицы, используя следующий код в (iOS) Xcode 9, Swift 4.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
        cell.selectionStyle = .none
        return cell


}
19
parvind

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

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)
}
19
wzbozon

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

Settings UITableView

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

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

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

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

14
Yarek T

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

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

cell.selectionStyle = UITableViewCellSelectionStyle.None
11
Gaurav Patel

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

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

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

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

11
iDhaval

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

cell?.selectionStyle = UITableViewCellSelectionStyle.None
10
priyanka gautam

попробуй это

cell.selectionStyle = UITableViewCellSelectionStyleNone;

а также

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

10
v_1

Хотя это лучшее и самое простое решение, чтобы ряд не отображал выделение во время выделения.

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

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

Чтобы отключить подсветку UItableviewcell

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

cell.userInteractionEnabled = NO;
6
Sharme

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

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

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

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

6
virindh

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

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

[tableView deselectRowAtIndexPath:indexPath animated:NO];

в табличном представлении сделайте выбор метода индекса.

6
Annu

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

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

Или же

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Кроме того, не реализуйте ниже делегат

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

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

5
Jayprakash Dubey

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

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

Удачного кодирования !!!

5
Rinku Sadhwani
cell.selectionStyle = UITableViewCellSelectionStyleNone;
5
iDeveloper

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
5
Mak083

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

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
Zorayr

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;
5
iEinstein

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

5
Cindy

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

cell.userInteractionEnabled = NO;

Этот подход не вызовет метод didSelectRowAtIndexPath:.

2
Aniruddh Joshi

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

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

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

- (void) setSelected:(BOOL)selected animated:(BOOL)animated
{
}
2
ashevin

Вы можете отключить подсветку ячейки таблицы, используя следующий код в (iOS) Xcode 9, Swift_ 4.

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
        cell.selectionStyle = .none
        return cell


}
1
praful argiddi