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 ]

4 голосов
/ 29 января 2013

Вы можете использовать метод tableView:willDisplayCell, чтобы выполнить все виды настройки для tableViewCell.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
     [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
     [cell setUserInteractionEnabled:NO];

     if (indexPath.section == 1 && indexPath.row == 0)
     {
         [cell setSelectionStyle:UITableViewCellSelectionStyleGray];
         [cell setUserInteractionEnabled:YES];
     }
} 

В этом коде выше пользователь может выбрать только первую строку во втором разделе tableView. Остальные все строки не могут быть выбраны. Спасибо! ~

3 голосов
/ 02 ноября 2014

Для быстрого:

cell.selectionStyle = .None
cell.userInteractionEnabled = false
1 голос
/ 14 февраля 2011

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Важно: обратите внимание, что это только свойство стиля, которое фактически не отключает ячейку. Чтобы сделать это, вы должны проверить selectionStyle в вашей реализации делегата didSelectRowAtIndexPath::

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if(cell.selectionStyle == UITableViewCellSelectionStyleNone) {
        return;
    }

    // do your cell selection handling here
}
1 голос
/ 08 июня 2016

на Xcode 7 без кодирования вы можете просто сделать следующее:

В виде структуры выберите Ячейку табличного представления. (Ячейка вложена в «Сцена контроллера табличного представления»> «Контроллер табличного представления»> «Представление таблицы». Возможно, вам придется раскрыть эти объекты, чтобы увидеть ячейку табличного представления)

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

1 голос
/ 02 сентября 2014

ПРОСТО

Просто используйте cell.userInteractionEnabled = YES; для ячейки, если она может перемещаться и cell.userInteractionEnabled = NO; в противном случае

1 голос
/ 19 августа 2015

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

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (cell.accessoryType != UITableViewCellAccessoryDisclosureIndicator) {
        return nil;
    }
    return indexPath;
}
1 голос
/ 03 апреля 2015

Мне нравится ответ Брайана Чападоса выше. Однако это означает, что у вас может быть дублированная логика как в cellForRowAtIndexPath, так и в willSelectRowAtIndexPath, которая может легко выйти из синхронизации. Вместо дублирования логики, просто проверьте selectionStyle:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (cell.selectionStyle == UITableViewCellSelectionStyleNone)
        return nil;

    else
        return indexPath;
}
0 голосов
/ 13 сентября 2017

для swift 3.0 вы можете использовать приведенный ниже код для отключения взаимодействия пользователя с ячейкой UITableView

 cell.isUserInteractionEnabled = false
0 голосов
/ 10 апреля 2015

Для Xcode 6.3:

 cell.selectionStyle = UITableViewCellSelectionStyle.None;
0 голосов
/ 26 апреля 2019

Я согласен с ответом Брайана

если я сделаю

cell.isUserInteractionEnabled = false 

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

На другом сайте, настройка

cell.selectionStyle = .none

вызовет метод didSelect, несмотря на то, что цвет обновления не обновляется.

Используя willSelectRow, я решил свою проблему. Пример:

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {

    if indexPath.section == 0{

        if indexPath.row == 0{
            return nil
        }

    }
    else if indexPath.section == 1{

        if indexPath.row == 0{
            return nil
        }

    }

    return indexPath

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...