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

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

30 ответов


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

tableView.allowsSelection = NO;

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

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


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

Цель-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

или

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Swift 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3 и 4.x:

cell.selectionStyle = .none

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

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


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



Итак, на самом деле есть 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 документация.)

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


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

UITableView Inspector


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

cell.selectionStyle = .none

в случае, если кому-то нужен ответ для Свифт:

cell.selectionStyle = .None

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

didSelectRowAtIndexPath

следующее

[tableView deselectRowAtIndexPath:indexPath animated:YES];

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


в своем UITableViewCell ' s XIB в Инспекторе атрибутов задайте значение Selection to None.

enter image description here


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

Цель-C:

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

    self.tableView.allowsSelection = NO;
    
  2. ниже фрагмент отключить подсветку, и он не отключает вызов didSelectRowAtIndexPath. Выберите стиль выбор сотовых нет в cellForRowAtIndexPath

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

    self.tableView.userInteractionEnabled = false;
    

Свифт:

ниже Swift эквивалент выше Objective-C решения:

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

    self.tableView.allowsSelection = false
    
  2. замена второй Решение

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

    self.tableView.userInteractionEnabled = false
    

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

Settings UITableView

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

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

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

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


для быстрого отбора

cell.selectionStyle = .None

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

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

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

нужно установить стиль выбора нет из построителя интерфейса


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

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

cell.selectionStyle = UITableViewCellSelectionStyle.None

попробуй такое

cell.selectionStyle = UITableViewCellSelectionStyleNone;

и

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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


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

cell?.selectionStyle = UITableViewCellSelectionStyle.None

хотя это лучшее и простое решение для предотвращения отображения строки во время выделения

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];

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


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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

cell.userInteractionEnabled = NO;

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

удачи в кодировании !!!


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


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

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

можно использовать selectionStyle собственность UITableViewCell

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

или

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

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

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