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



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

703   30  

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.To отключите синюю подсветку без изменения любого другого взаимодействия ячейки:

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

[tableView setAllowsSelection:NO];

в моем тестировании это все еще позволяет управлять внутри UITableViewCell чтобы быть интерактивным.


3.Чтобы сделать ячейку "только для чтения", вы можете просто сделать это:

[cell setUserInteractionEnabled:NO];



4.To сделайте всю таблицу "только для чтения"

[tableView setUserInteractionEnabled:NO];



5.To определите на лету, следует ли выделять ячейку (которая в соответствии с ответ неявно включает выделение), можно реализовать следующее 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, или любые другие методы, описанные здесь.

вы также можете отключить выбор строки из самого построителя интерфейса, выбирая 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:

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

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

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

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

    self.tableView.userInteractionEnabled = false
    

я боролся с этим довольно-таки обильно тоже, имея контроль в моем UITableViewCell запрещено использование userInteractionEnabled собственность. У меня есть 3 ячейки статической таблицы для настроек, 2 с датами, 1 с выключателем включения/выключения. После игры в Storyboard / IB мне удалось сделать нижний не выбираемым, но когда вы нажимаете на него, выбор из одной из верхних строк исчезает. Вот НЗП изображение моих настроек 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];

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

чтобы отключить подсветку 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, чтобы нет, сняв его. Это сделает ваш tableview только для чтения.

Comments

    Ничего не найдено.