Отключить выбор одного UITableViewCell - PullRequest
35 голосов
/ 30 августа 2010

Как отключить выбор только одной ячейки в UITableView? У меня их несколько, и я хочу отключить только последнее.

Ответы [ 9 ]

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

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

cell.userInteractionEnabled = NO;

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

Обратите внимание, что если у вас есть интерактивные элементы в ячейке (т.е. переключатели / кнопки), выВам нужно будет использовать cell.selectionStyle = UITableViewCellSelectionStyleNone; вместо этого, а затем обязательно игнорировать нажатия на ячейку в tableView:didSelectRowAtIndexPath:.

51 голосов
/ 30 августа 2010
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UITableViewCell *cell = ...

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

}
18 голосов
/ 04 сентября 2013

Добавьте это в свой пользовательский стол VC:

// cells lacking UITableViewCellAccessoryDisclosureIndicator will not be selectable
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    if (cell.accessoryType != UITableViewCellAccessoryDisclosureIndicator) {
        return nil;
    }
    return indexPath;
}

// disabled cells will still have userinteraction enabled for their subviews
- (void)setEnabled:(BOOL)enabled forTableViewCell:(UITableViewCell *)tableViewCell
{
    tableViewCell.accessoryType = (enabled) ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone;
    // if you dont want the blue selection on tap, comment out the following line
    tableViewCell.selectionStyle = (enabled) ? UITableViewCellSelectionStyleBlue : UITableViewCellSelectionStyleNone;
}

Затем, чтобы включить / отключить выбор для someTableViewCell, сделайте следующее:

[self setEnabled:state forTableViewCell:someTableViewCell];

Вы закончили и можете отправить.

10 голосов
/ 30 августа 2010
-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([self numberOfRowsInSection] == [indexPath row]) {
        return nil;
    } else {
        return indexPath;
    }
}

последняя строка таблицы не будет выбрана

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

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

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

и в этом методе нужно использовать

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

1 голос
/ 06 января 2014

Самое чистое решение, которое я нашел для этого, использует только метод делегата willDisplayCell.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([indexPath row] == 0) //<-----ignores touches on first cell in the UITableView
    {                        //simply change this around to suit your needs
        cell.userInteractionEnabled = NO;
        cell.textLabel.enabled = NO;
        cell.detailTextLabel.enabled = NO;
    }
}

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

0 голосов
/ 14 октября 2015

Если кому-то интересно, как этого добиться в кратчайшие сроки, то вот мой код.Я использую Xcode 7 и протестировал с помощью iPad Retina (iOS 9).

cell.selectionStyle = UITableViewCellSelectionStyle .None
cell.userInteractionEnabled = false

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

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)

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

cell.selectionStyle = UITableViewCellSelectionStyle .None

Только эта строка будет блокировать выделение для ваших ячеек.

Однако вторая строка сделает ячейку доступной только для чтения.То есть ..

cell.userInteractionEnabled = false

Спасибо

Надеюсь, это помогло.

0 голосов
/ 08 июля 2015

Попробуйте это по-быстрому:

self.tableView.deselectRowAtIndexPath(indexPath, animated: true)
0 голосов
/ 14 мая 2014

с iOS 6.

Вы можете использовать следующий метод делегата и вернуть NO, если он не выбран, и YES, если хотите, чтобы он был выбран.

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    return indexPath.section == 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...