UITableview: Как отключить выделение для некоторых строк, но не для других - PullRequest
274 голосов
/ 15 февраля 2010

Я отображаю в группе tableview содержимое, проанализированное из XML. Я хочу отключить событие щелчка по нему (я вообще не смогу его щелкнуть). Таблица содержит две группы. Я хочу отключить выбор только для первой группы, но не для второй группы. Нажав на первый ряд второй группы navigates на мою трубку player view.

Как я могу сделать выбор только определенных групп или строк?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if(indexPath.section!=0)
    if(indexPath.row==0)    

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:tubeUrl]];   
}

Спасибо.

Ответы [ 21 ]

472 голосов
/ 15 февраля 2010

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

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

// Default style
cell.selectionStyle = UITableViewCellSelectionStyleBlue;

// Gray style
cell.selectionStyle = UITableViewCellSelectionStyleGray;

Обратите внимание, что ячейка с selectionStyle = UITableViewCellSelectionStyleNone; по-прежнему будет вызывать пользовательский интерфейс для вызова didSelectRowAtIndexPath при прикосновении пользователя. Чтобы избежать этого, сделайте, как предложено ниже, и установите.

cell.userInteractionEnabled = NO;

вместо этого. Также обратите внимание, что вы можете установить cell.textLabel.enabled = NO; для серого элемента.

339 голосов
/ 15 февраля 2010

Если вы хотите создать строку (или подмножество строк) без возможности выбора , реализуйте метод UITableViewDelegate -tableView:willSelectRowAtIndexPath: (также упомянутый TechZen). Если indexPath не должен быть выбираемым , верните nil, в противном случае верните indexPath. Чтобы получить поведение выбора по умолчанию, вы просто возвращаете indexPath, переданный методу delegate, но вы также можете изменить выбор строки, возвращая другой indexPath.

пример:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // rows in section 0 should not be selectable
    if ( indexPath.section == 0 ) return nil;

    // first 3 rows in any section should not be selectable
    if ( indexPath.row <= 2 ) return nil;

    // By default, allow row to be selected
    return indexPath;
}
54 голосов
/ 13 февраля 2015

Начиная с iOS 6, вы можете использовать

-tableView:shouldHighLightRowAtIndexPath:

Если вы вернете NO, он отключит подсветку выделения и сегменты, запускаемые раскадровкой, связанные с этой ячейкой.

Метод вызывается, когда касание падает на ряд. Возвращение NO к этому сообщению останавливает процесс выбора и не приводит к тому, что выбранная в данный момент строка теряет выбранный вид при касании.

Справочник по протоколу UITableViewDelegate

16 голосов
/ 23 июня 2012

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

В моем случае я представлял UIS-переключатель в середине строки и хотел отключить выбор для остальной части строки (которая пуста), но не для переключателя! Правильный способ сделать это, следовательно, в методе

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

где выписка вида

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

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

Более того, используя метод

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

чтобы отменить выделение ячейки с помощью оператора вида

[tableView deselectRowAtIndexPath:indexPath animated:NO];

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

Только мои два цента. Я уверен, что многие найдут это полезным.

10 голосов
/ 15 февраля 2010

Вы перехватываете выборки с помощью этих методов источника данных.

– tableView:willSelectRowAtIndexPath: 
– tableView:didSelectRowAtIndexPath: 
– tableView:willDeselectRowAtIndexPath: 
– tableView:didDeselectRowAtIndexPath:

В этих методах вы проверяете, является ли выбранная строка той, которую вы хотите выбрать. Если это так, принять меры, если нет, ничего не делать.

К сожалению, вы не можете отключить выбор только для одного раздела. Это весь стол или ничего.

Однако можно установить для свойства ячеек таблицы selectionStyle значение UITableViewCellSelectionStyleNone. Я считаю, что сделает выбор невидимым. В сочетании с описанными выше методами, которые должны заставить клетки выглядеть полностью инертными с точки зрения пользователя.

Edit01:

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

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

9 голосов
/ 09 октября 2015

Для Swift 4.0 , например:

cell.isUserInteractionEnabled = false
cell.contentView.alpha = 0.5
9 голосов
/ 12 октября 2012

Вам нужно сделать что-то вроде следующего, чтобы отключить выбор ячеек в методе cellForRowAtIndexPath:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
[cell setUserInteractionEnabled:NO];

Чтобы ячейка отображалась серым цветом, введите в методе tableView:WillDisplayCell:forRowAtIndexPath следующее:

[cell setAlpha:0.5];

Один метод позволяет вам контролировать интерактивность, а другой - контролировать внешний вид пользовательского интерфейса.

5 голосов
/ 01 июня 2011

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

cell.userInteractionEnabled = NO;

Наряду с предотвращением выделения это также останавливает tableView: didSelectRowAtIndexPath: вызывается для ячеек, для которых он установлен.

5 голосов
/ 12 января 2017

Мое решение на основе модели данных:

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    let rowDetails = viewModel.rowDetails(forIndexPath: indexPath)
    return rowDetails.enabled ? indexPath : nil
}

func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
    let rowDetails = viewModel.rowDetails(forIndexPath: indexPath)
    return rowDetails.enabled
}
4 голосов
/ 30 ноября 2018

для Swift 4.0 Это сделает свое дело. Он отключит ячейку в методе didSelectRowAtIndexPath, но подпункты будут активными.

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
         if (indexPath.row == clickableIndex ) { 
            return indexPath
         }else{
            return nil
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...