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

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

вопрос задан 10.10.2008
DavidM
16269 репутация

36 ответов


  • 1860 рейтинг

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

    Цель-C:

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    

    или

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    

    Swift 2:

    cell.selectionStyle = UITableViewCellSelectionStyle.None
    

    Swift 3 и 4. х:

    cell.selectionStyle = .none
    

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

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

    ответ дан Martin Gordon, с репутацией 33380, 10.10.2008
  • 506 рейтинг

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

    tableView.allowsSelection = NO;

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

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

    ответ дан user41806, с репутацией 519, 22.07.2009
  • 338 рейтинг

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



    Итак, на самом деле есть 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
    
    ответ дан mbm29414, с репутацией 9163, 10.06.2011
  • 75 рейтинг

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

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

    cell.userInteractionEnabled = NO;
    

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

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

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    

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

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

    tableView.allowsSelection = NO;
    

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

    ответ дан JosephH, с репутацией 31218, 1.06.2011
  • 50 рейтинг

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

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

    ответ дан cbowns, с репутацией 4713, 31.10.2012
  • 45 рейтинг

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

    UITableView Inspector

    ответ дан vignesh kumar, с репутацией 1796, 25.04.2013
  • 42 рейтинг

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

    cell.selectionStyle = .none
    
    ответ дан MANISH PATHAK, с репутацией 1537, 7.01.2017
  • 33 рейтинг

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

    cell.selectionStyle = .None
    
    ответ дан Aks, с репутацией 6333, 2.12.2014
  • 31 рейтинг

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

    didSelectRowAtIndexPath
    

    следующие

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    

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

    ответ дан Chris Fox, с репутацией 524, 13.11.2012
  • 28 рейтинг

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

    enter image description here

    ответ дан Zaid Pathan, с репутацией 9712, 5.10.2016
  • 27 рейтинг

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

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

    ответ дан user41806, с репутацией 519, 30.06.2009
  • 22 рейтинг

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

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    

    в cellForRowAtIndexPath написать этот код.

    ответ дан Ahsan Ebrahim, с репутацией 927, 30.03.2015
  • 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)
    }
    
    ответ дан wzbozon, с репутацией 7950, 27.05.2011
  • 18 рейтинг

    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
      
    ответ дан Arun Gupta, с репутацией 1887, 22.11.2014
  • 13 рейтинг

    Я тоже с этим боролся, потому что в моем 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, поэтому ячейка не мерцает при событиях приземления.

    ответ дан Yarek T, с репутацией 7173, 3.01.2013
  • 12 рейтинг

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

    cell.selectionStyle = .None
    
    ответ дан parvind, с репутацией 629, 30.03.2015
  • 10 рейтинг

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

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

    cell.selectionStyle = UITableViewCellSelectionStyle.None
    
    ответ дан Gaurav Patel, с репутацией 545, 18.05.2016
  • 10 рейтинг

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

     cell.selectionStyle = UITableViewCellSelectionStyleNone;
    

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

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

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

    ответ дан iDhaval, с репутацией 7456, 24.03.2012
  • 9 рейтинг

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

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
    
    ответ дан priyanka gautam, с репутацией 277, 19.10.2015
  • 9 рейтинг

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

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    

    и

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    

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

    ответ дан v_1, с репутацией 682, 9.07.2012
  • 7 рейтинг

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

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    

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

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
         [tableView deselectRowAtIndexPath:indexPath animated:NO];
    ...
    }
    
    ответ дан Steve Barden, с репутацией 350, 20.08.2013
  • 6 рейтинг

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

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

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

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

    ответ дан virindh, с репутацией 3007, 14.01.2014
  • 5 рейтинг

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

     cell.selectionStyle = UITableViewCellSelectionStyleNone;
    

    или

     [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    

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

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

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

    ответ дан Jayprakash Dubey, с репутацией 22716, 15.05.2015
  • 5 рейтинг

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

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    

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

    cell.userInteractionEnabled = NO;
    
    ответ дан Sharme, с репутацией 480, 18.01.2013
  • 5 рейтинг
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    [cell setSelected:NO animated:NO];
    [cell setHighlighted:NO animated:NO];
    

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

    ответ дан Rinku Sadhwani, с репутацией 86, 31.07.2014
  • 5 рейтинг
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
    ответ дан iDeveloper, с репутацией 213, 10.04.2014
  • 5 рейтинг

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

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    
    ответ дан Mak083, с репутацией 846, 8.10.2013
  • 5 рейтинг

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

    enter image description here

    ответ дан Kamani Jasmin, с репутацией 307, 13.04.2018
  • 5 рейтинг

    Swift Solution с пользовательской ячейкой:

    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
      } 
    }
    
    ответ дан Zorayr, с репутацией 14360, 19.02.2015
  • 5 рейтинг

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

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
    ответ дан iEinstein, с репутацией 1879, 10.05.2013
  • 5 рейтинг

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

    ответ дан Cindy, с репутацией 114, 4.12.2014
  • 5 рейтинг

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

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    

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

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

    [tableView deselectRowAtIndexPath:indexPath animated:NO];
    

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

    ответ дан Annu, с репутацией 3062, 12.07.2014
  • 4 рейтинг

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

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    

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

    ответ дан Harini, с репутацией 143, 25.08.2013
  • 1 рейтинг

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

    cell.userInteractionEnabled = NO;
    

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

    ответ дан Aniruddh Joshi, с репутацией 5929, 17.12.2012
  • 1 рейтинг

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

    - (void) setHighlighted:(BOOL)highlighted
    {
    }
    
    - (void) setHighlighted:(BOOL)highlighted animated:(BOOL)animated
    {
    }
    
    - (void) setSelected:(BOOL)selected animated:(BOOL)animated
    {
    }
    
    ответ дан ashevin, с репутацией 114, 25.04.2013
  • 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
    
    
    }
    
    ответ дан praful argiddi, с репутацией 96, 14.09.2018