Подтвердить что ты не робот

Отключить выбор одного UITableViewCell

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

4b9b3361

Ответ 1

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UITableViewCell *cell = ...

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

}

Ответ 2

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

cell.userInteractionEnabled = NO;

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

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

Ответ 3

Бросьте это в свою собственную таблицу 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];

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

Ответ 4

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([self numberOfRowsInSection] == [indexPath row]) {
        return nil;
    } else {
        return indexPath;
    }
}

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

Ответ 5

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

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

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

Ответ 6

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

Ответ 7

с iOS 6.

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

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    return indexPath.section == 0;
}

Ответ 8

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

self.tableView.deselectRowAtIndexPath(indexPath, animated: true)

Ответ 9

Если кто-то задается вопросом, как это сделать быстро, то вот мой код. Я использую 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

Спасибо

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