UITableView Встановлення деяких комірок як "невибірних"


109

Як я можу встановити властивість комірки UITableView таким, що не можна вибрати? Я не хочу бачити це синє поле вибору, коли користувач натискає на комірку.


4
Зауважте останніх googlers: спосіб зробити це станом на iOS 6 і вище - це так, tableView:shouldHighlightRowAtIndexPath:як відмітив
Айуш

Відповіді:


151

Встановіть selectionStyleвластивість комірки таблиці на UITableViewCellSelectionStyleNone. Це повинно перешкоджати виділенню, і ви також можете перевірити цю властивість у своєму tableView:didSelectRowAtIndexPath:.


3
Кендалл має рацію. Дотримуйтесь відповіді Себастьяна Селіса, щоб запобігти виклику didSelectRowAtIndexPath в першу чергу. Також слід встановити selectionStyle, щоб запобігти виділенню.
Даніель Дікісон

так, я вважаю, що відповідь Себастьяна
Селіса

1
Вболівальники аркушів, що використовують статичні TableViews, можуть вибрати UITableViewCell, а за допомогою інспектора атрибутів можна знайти поле вибору та встановити його на None
Manuel BM

197

Для запобігання вибору рядків

Щоб повністю запобігти вибору 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

10
Це, на мою думку, має бути прийнятою відповіддю. Він фактично виправляє проблему, а не маскує її.
Tovi7

4
Зауважте, що tableView: willSelectRowAtIndexPath: викликається після виділення комірки, яка створить мерехтіння. З опису Apple: Цей метод не використовується, поки користувачі не торкаються ряду і не піднімають палець; рядок не вибрано до цього часу, хоча він підсвічується при натисканні вниз.
Даніель

5
Я згоден з @simpleBob. Для того, щоб використовувати це рішення, вам також потрібно встановити cell.selectionStyle на UITableViewCellSelectionStyleNone у невідбірних рядках. Інакше це виглядає липко.
Кайл Клегг

Тоді найкращою відповіддю все ж є прийнята відповідь. Ви можете просто вибрати нічого не робити, didSelectRowAtIndexPathтому що willSelectRowAtIndexPathзавжди будете називатися.
Метью Кірос

16

використовуй це:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

5
Це лише зупиняє показ кольору вибору, didSelectRowAtIndexPathвсе ще називається.
зекель

Це також точно така ж відповідь, як і Даніель Дікісон на це питання.

Swift 2.2 UPDATE - 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
Проблема в цьому полягає в тому, що це робить його таким чином, щоб усі комірки в таблиці не були обрані. Якщо ви хочете, щоб одні клітинки були обрані, а інші не були вибрані, це не зробить. Підхід Себастьяна працював на мене.
Террі

Правда, enableSelection = NO відключить вибір для всіх комірок.
JOM

1
Чи є еквівалентна властивість в Interface Builder для цієї властивості?
chrish

8

Встановити cell.userInteractionEnabled = NO;


Зачекайте, зробіть це так. Різновид. зробіть "FALSE" малі і втрачайте цю божевільну крапку з комою. Це швидко це зробить для вас. "ЛАЖКА" була зла і неправильна, тепер "НІ" - це зло і неправильно. До наступного тижня, коли «неправда» є злом і неправильно, робіть це так.
HalR


3

Apple каже, що перше, що ви повинні зробити в didSelectRowAtIndexPath - це скасувати вибір рядка

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

Тоді ви можете змінити AccessoryType, щоб бути галочкою, або ні, і т. Д. Отже, коли ви введете didSelectRowAtIndexPath, ви можете скасувати вибір рядка, і якщо його не призначено для вибору, просто не перевіряйте цей рядок.

Посібник з програмування таблиці


1
У тому випадку, коли користувач торкнеться комірки, вона буде виділена ненадовго, а потім непросвіченою - але, як я розумію, сенс повністю зупинити її від виділення.
Kuba Suder

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
    }
}

Це швидка версія відповіді Себастьяна Селіса.


1

Якщо ви спроектували свою клітинку в Interface Builder, ви можете це зробити, знявши прапорець із пункту " Взаємодія користувачів увімкнено " для tableViewCell.


0

Є ще один простий спосіб уникнути того, що виділення виглядають синіми.

Виберіть клітинку, яку ви не хочете виглядати синьою.

Потім виберіть інспектор атрибутів (значок екрана поруч із лінією лінійки на панелі перегляду властивостей збоку).

Потім змініть поле "Вибір" з "Синього" на "Нічого".

Зауважте, імовірно, це все ще вибирається, воно просто не відображатиметься як вибране, якщо все, що вам потрібно, це уникнути ефекту інтерфейсу користувача.


0

Використовуйте tableView: willDisplayCell: forRowAtIndexPath: замість tableView: didSelectRowAtIndexPath: щоб позбутися від спалаху, який з’являється вперше, коли ви торкаєтесь комірки.

- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}

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;рядок, все одно буде вибрано і є ймовірність збоїв у програмі



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.