UITableView Установка некоторых ячеек как «недоступных для выбора»

109

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

Mugunth
источник
4
Обратите внимание на недавних гуглеров: способ сделать это начиная с iOS 6 и более поздних версий, tableView:shouldHighlightRowAtIndexPath:как отмечает Аюш ниже
jemmons

Ответы:

151

Задайте для selectionStyleсвойства ячейки таблицы значение UITableViewCellSelectionStyleNone. Это должно предотвратить его выделение, и вы также можете проверить это свойство в своем tableView:didSelectRowAtIndexPath:.

Дэниел Дикисон
источник
3
Кендалл прав. Следуйте ответу Себастьяна Селиса, чтобы предотвратить вызов didSelectRowAtIndexPath в первую очередь. Вы также должны установить selectionStyle, чтобы предотвратить выделение.
Дэниел Дикисон
да, я полагаю, что ответ Себастьяна Селиса будет правильным ответом, спасибо Даниэль
LolaRun
1
Поклонники раскадровки, использующие статические TableViews, могут выбрать UITableViewCell, а в Attributes Inspector найти поле выбора и установить для него значение None
Мануэль Б.М.
198

Чтобы предотвратить выбор строки

Для того, чтобы полностью предотвратить выделение из UITableViewCell, есть ваш UITableViewDelegateреализовать tableView:willSelectRowAtIndexPath:. Из этого метода вы можете вернуться, nilесли не хотите, чтобы строка выбиралась.

- (NSIndexPath *)tableView:(UITableView *)tv willSelectRowAtIndexPath:(NSIndexPath *)path
{
    // Determine if row is selectable based on the NSIndexPath.

    if (rowIsSelectable) {
        return path;
    }
    return nil;
}

Это предотвращает выбор и tableView:didSelectRowAtIndexPath:вызов строки . Обратите внимание, однако, что это не предотвращает выделение строки.

Чтобы предотвратить выделение строк

Если вы хотите, чтобы строка не выделялась визуально при прикосновении, вы можете убедиться, что для ячейки selectionStyleустановлено значение UITableViewCellSelectionStyleNone, или, желательно, вы можете иметь свое UITableViewDelegateприспособление tableView:shouldHighlightRowAtIndexPath:следующим образом:

- (BOOL)tableView:(UITableView *)tv shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Determine if row is selectable based on the NSIndexPath.

    return rowIsSelectable;
}
Себастьян Селис
источник
1
Спасибо! Именно то, что мне нужно.
Buchannon
11
На мой взгляд, это должен быть принятый ответ. Это фактически решает проблему, а не маскирует ее.
Tovi7 08
4
Обратите внимание, что tableView: willSelectRowAtIndexPath: вызывается после выделения ячейки, что вызывает мерцание. Из описания Apple: этот метод не вызывается, пока пользователь не коснется строки, а затем поднимет палец; строка не выбрана до тех пор, хотя она выделяется при касании.
Daniel
5
Я согласен с @simpleBob. Чтобы использовать это решение, вам также необходимо установить для cell.selectionStyle значение UITableViewCellSelectionStyleNone в невыбираемых строках. В остальном это выглядит безвкусно.
Кайл Клегг
Тогда лучшим ответом по-прежнему будет принятый ответ. Вы можете просто выбрать ничего не делать, didSelectRowAtIndexPathпотому willSelectRowAtIndexPathчто в любом случае он будет вызываться всегда.
MLQ
16

использовать это:

cell.selectionStyle = UITableViewCellSelectionStyleNone;
hanumanDev
источник
5
Это только останавливает отображение цвета выделения, didSelectRowAtIndexPathвсе еще вызывается.
zekel
Это точно такой же ответ, что и Дэниел Дикисон на этот вопрос.
ОБНОВЛЕНИЕ Swift 2.2 - cell.selectionStyle = UITableViewCellSelectionStyle.None
uplearnedu.com
11

Только для iOS 6+.

Вы можете реализовать метод tableView:shouldHighlightRowAtIndexPath:в своем делегате. Подробнее читайте здесь: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html.

Аюш Гоэль
источник
3
Должно быть гораздо больше голосов за. Это правильный ответ: изменение стиля выделения, чтобы вы не видели, что ячейка выбрана, отключение взаимодействия с пользователем, чтобы вы не могли нажимать на ячейку, или отмена выбора ячеек при выборе - это хаки.
Стюарт Кэмпбелл
9

Если бы эта проблема тоже перепробовала все уже упомянутое. Последней уловкой, позволившей избавиться от «синей вспышки» при выборе ячейки таблицы, было добавление такой строки:

self.myTableView.allowsSelection = NO;

Не уверен, была ли это одна линия или все вместе, но в целом я не получил больше синего выделения или даже синей вспышки. Счастливый!

ЛОМ
источник
1
Проблема в том, что это делает невозможным выбор всех ячеек в табличном представлении. Если вы хотите, чтобы некоторые ячейки можно было выбирать, а другие нельзя было выбирать, этого не произойдет. Подход Себастьяна сработал для меня.
Terry
Верно, allowSelection = NO отключит выбор для всех ячеек.
JOM
1
Есть ли эквивалентное свойство в Интерфейсном Разработчике для этого свойства?
chrish
8

Устанавливать cell.userInteractionEnabled = NO;

Роб Боннер
источник
Подожди, сделай так. Вроде, как бы, что-то вроде. сделайте «FALSE» строчными буквами и потеряйте эту сумасшедшую точку с запятой. Это ускорит это для вас. «ЛОЖЬ» было злом и неправильным, теперь «НЕТ» - зло и неправильно. До следующей недели, когда «ложь» будет злом, а ложь - так поступать.
HalR
5

Использование IB также является элегантным способом:

введите описание изображения здесь

Брайан
источник
3

Apple говорит, что первое, что вы должны сделать в didSelectRowAtIndexPath, - это отменить выбор строки

[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];

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

Руководство по программированию в табличном представлении

Ряндай
источник
1
В этом случае, когда пользователь касается ячейки, она будет выделена на короткое время, а затем отключена, но, как я понимаю, суть в том, чтобы полностью остановить ее выделение.
Куба Судер
3

Другой способ - добавить в UITableViewCell. Мне этот ответ нравится больше, чем ответ Себастьяна (тоже хороший), потому что я строю свой стол. Я подумал, что это может быть полезно кому-то другому.

- (void)setSelectable:(BOOL)enabled {
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
    [self setUserInteractionEnabled:enabled];
}

- (BOOL)isSelectable {
    BOOL disabled = [self selectionStyle]==UITableViewCellSelectionStyleNone &&
                     [self isUserInteractionEnabled];
    return ! disabled;
}
Зекель
источник
3

Swift 4:
вы можете предотвратить выбор и выделение с помощью UITableViewDelegate: shouldHighlightRowAt

Этот ответ предполагает, что у вас есть созданная настраиваемая ячейка с именем: CustomTableViewCell
И что вы создали логическое значение внутри этой настраиваемой ячейки с именем: isSelectable

func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
    let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
    if cell.isSelectable == false {
        return false
    } else {
        return true
    }
}

Это Swift-версия ответа Objc Себастьяна Селиса.

Чейз МакЭлрой
источник
1

Если вы создали свою ячейку в Interface Builder, вы можете сделать это, сняв флажок « Взаимодействие с пользователем включено » для tableViewCell.

Джей
источник
0

Есть еще один простой способ избежать выделения синего цвета.

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

Затем выберите инспектор атрибутов (значок щита рядом со значком линейки на панели свойств сбоку).

Затем измените значение поля «Выбор» с «Синего» на «Нет».

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

Sien
источник
0

Используйте tableView: willDisplayCell: forRowAtIndexPath: вместо tableView: didSelectRowAtIndexPath:, чтобы избавиться от вспышки, которая появляется при первом прикосновении к ячейке.

- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
user3164248
источник
0

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

В методе ниже

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

после выделения ячейки напишите код ниже

if(indexPath.row == someCellNumber) cell.selectionStyle =UITableViewCellSelectionStyleNone;

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

в этом методе делегата ниже

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    if(indexPath.row == someCellNumber) return;

    //for other cells write the code below...
}

если вы не пишете, if(indexPath.row == someCellNumber) return;строка все равно будет выбрана, и есть вероятность сбоя приложения

Дипу Раджак
источник
0

Swift 4:

В классе ячеек:

selectionStyle = .none
Эдем
источник