Як я можу відключити вибір UITableView?


1192

Коли ви натискаєте рядок у UITableView, рядок виділяється та вибирається. Чи можна відключити це, якщо торкнення рядка нічого не робить?


17
Оригінальне запитання має погану назву. ОП хочуть в першу чергу відключити selection, і, звичайно, highlightingвідключають це. Багато відповідей з високим рівнем пояснення пояснюють, як disable selectionвідмовитись від заборони highlighting. Щоб вимкнути лише використання підсвічування, cell.selectionStyle = .Noneперейдіть наstoryboard / cell / Selection = None
Андрій,

Оновіть або назву, або публікацію. Я збентежений. І грунтуючись на цьому питанні, я не маю уявлення, які саме відповіді маються на увазі.
Даніель Спрінгер

Відповіді:


603

Для мене добре працювали:

tableView.allowsSelection = false

Це означає, що didSelectRowAt#просто не вийде. Тобто, торкаючись до ряду столу, як такого, не буде робити нічого. (Отже, очевидно, ніколи не буде вибраної анімації.)

(Зверніть увагу, що якщо у клітинках у вас є UIButtonчи будь-які інші елементи управління, звичайно, ці елементи контролю все ще працюватимуть. Будь-які елементи керування, які у вас трапляються у комірці таблиці, абсолютно не пов'язані зі здатністю UITableView дозволяти "вибирати рядок" використовуючи didSelectRowAt#.)

Ще один момент, який слід зазначити: це не працює, коли UITableViewперебуває в режимі редагування. Для обмеження вибору комірок в режимі редагування використовуйте код, як показано нижче:

tableView.allowsSelectionDuringEditing = false 

6
нарешті це спрацювало для мене, я намагався використовувати cell.selectionStyle = UITableViewCellSelectionStyleNone; але це не спрацювало. Варто зазначити одне: воно повинно бути: tableView.allowsSelection = НІ; не хибно.
tony.tc.leung

6
Я думаю, це найкращий варіант. Кнопки на клітинках активні з цим, але текст не активний.
Фахім Паркар

513
Як це прийнята відповідь і набрали стільки голосів? Це зовсім не відповідає на питання! Потрібно встановити selectionStyleвластивість у комірці: cell.selectionStyle = UITableViewCellSelectionStyle.Noneу Swift або cell.selectionStyle = UITableViewCellSelectionStyleNoneу Objective-C.
вузольна база

5
Це працює для мене в Свіфт 2.tableView.allowSelection = false
Khanad

15
Існує кілька способів зробити це залежно від бажаного. Жоден стиль вибору та жоден вибір не можуть працювати інакше, або й інший. Ось приклад. Якщо ви хочете вибрати клітинку, яку tableViewDidSelectRowAtIndexPathпотрібно викликати, cell.selectionStyle = .Noneбажано. Якщо ви не хочете або не турбуєтесь про те, щоб викликати функцію делегата (тобто мати текстове поле у ​​таблиціViewCell), tableView.allowsSelection = falseце просто чудово.
Made2k

1963

Все, що вам потрібно зробити, це встановити стиль вибору для UITableViewCellекземпляра, використовуючи:

Завдання-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

або

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Швидкий 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3 і 4.x:

cell.selectionStyle = .none

Крім того, переконайтеся, що ви або не реалізуєте -tableView:didSelectRowAtIndexPath:у своєму представнику таблиці таблицю або явно виключаєте комірки, з якими ви хочете не робити жодних дій, якщо ви їх реалізуєте.

Більше інформації тут і тут


122
@Tony Це погана ідея, якщо у вас є UITextField всередині комірки.
Aniruddh Joshi

73
@TonyMillion - це також погана ідея, якщо ви хочете використовувати вбудовані елементи редагування, такі як проведіть пальцем для видалення. Якщо ви встановите UserInteractionEnabled на NO, кнопка видалення не реагує на події користувача.
Карлос П

47
пізно до цього потоку, але замість userInteraction використовуйте cell.allowsSelection. Це зупиняє методи взаємодії комірки, але не блокує звичайний матеріал для відповіді UIView.
Кріс C

4
Встановлення cell.userInteractionEnable = Ні, це не зупинить ініціювання didSelectRowAtIndexPath.
user4951

25
Я проголосую відповідь, але для того, щоб було зрозуміло, ОП попросила лише відключити "підсвічування", не відключити взаємодію цілої комірки, тому всі ці коментарі є офтопічними.
Фредерік Йесид Пенья Санчес

353

Оскільки я нещодавно прочитав цю публікацію, і це мені допомогло, я хотів опублікувати ще одну відповідь, щоб закріпити всі відповіді (для нащадків).



Отже, насправді є 5 різних відповідей залежно від бажаної логіки та / або результату:

1.Відключити синє виділення, не змінюючи жодної іншої взаємодії комірки:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Я використовую це, коли у мене є UIButton - або якийсь інший елемент управління - розміщений в UITableViewCell, і я хочу, щоб користувач міг взаємодіяти з елементами управління, але не з самою коміркою.

ПРИМІТКА : Як Тоні Мільйон зазначав вище, це НЕ перешкоджаєtableView:didSelectRowAtIndexPath:. Я обіходжу це простими твердженнями "якщо", найчастіше тестуючи для розділу та уникаючи дії для певного розділу.

Ще один спосіб, який я думав перевірити на прослуховування комірки, такий:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // A case was selected, so push into the CaseDetailViewController
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (cell.selectionStyle != UITableViewCellSelectionStyleNone) {
        // Handle tap code here
    }
}



2.Щоб зробити це для всієї таблиці, ви можете застосувати вищевказаний розчин до кожної комірки таблиці, але ви також можете зробити це:

[tableView setAllowsSelection:NO];

У моєму тестуванні це все ще дозволяє UITableViewCellінтерактивним елементам управління всередині .


3.Щоб зробити клітинку "лише для читання", ви можете просто зробити це:

[cell setUserInteractionEnabled:NO];



4.Зробити всю таблицю "лише для читання"

[tableView setUserInteractionEnabled:NO];



5.Щоб визначити на ходу, чи слід виділити клітинку (яка відповідно до цієї відповіді неявно включає вибір), можна реалізувати такий UITableViewDelegateметод протоколу:

- (BOOL)tableView:(UITableView *)tableView 
   shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath

3
Якщо ви завантажите конструкцію комірок з ручки, прапорець (у IB) спрацює чудово для №3 (і для таблиць для №4). Для №4 проти №2, чи різниця в тому, чи будуть елементи керування всередині комірки інтерактивними?
lilbyrdie

4
Так. Якщо ви хочете відключити вибір, але дозволити UIButtons тощо ... продовжувати підтримувати взаємодію з користувачем, скористайтеся №2. Якщо ви хочете повністю клітинку лише для читання, використовуйте №4. Звичайно, чому б у вас не було нічого, крім UIViews або UILabels в неінтерактивній комірці, поза мною. Можливо, хтось захотів би відключити всю взаємодію, поки відбувається щось інше.
mbm29414

8
# 4 - це жахлива ідея, якщо це також вимкне прокручування у поданні таблиці
simon

4
@simon Власне, це не страшна ідея; це один із варіантів, який може бути, а може і не бути хорошим варіантом залежно від ваших обставин. Також №4 вимикає прокрутку USER; ви можете все-таки реалізувати своє, якщо потрібно. Я погоджуюсь, що №4 не є корисним МНОГО, але це не страшна ідея.
mbm29414

3
Для повноти ви можете, будь ласка, додати крик для tableView:shouldHighlightRowAtIndexPath:, що, як правило, (не завжди) є моїм кращим підходом.
Бенджон

82

Підводячи підсумки, я вважаю, що це правильні відповіді на основі мого власного досвіду в цьому:

Якщо ви хочете відключити вибір лише для деяких комірок, скористайтеся:

cell.userInteractionEnabled = NO;

Окрім запобігання вибору, це також зупиняє виклик tableView: didSelectRowAtIndexPath: для викликів для комірок, у яких його встановлено. (За цю відповідь заслуговує Тоні Мільйон, дякую!)

Якщо у ваших клітинках є кнопки, на які потрібно натиснути, вам потрібно:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

і вам також потрібно ігнорувати будь-які клацання клітинки в - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath.

Якщо ви хочете відключити вибір для всієї таблиці, використовуйте:

tableView.allowsSelection = NO;

(Заслуга Пауло Де Баррос, спасибі!)


що якщо у нас у кнопці є кнопка?
Умаїр Афзал

56

Станом на iOS 6.0, UITableViewDelegateмає tableView:shouldHighlightRowAtIndexPath:. (Про це читайте в Документації на iOS .)

Цей метод дозволяє позначити конкретні рядки як непросвічувані (і неявно, невибрані), не змінюючи стиль вибору комірки, возитися з обробкою події комірки userInteractionEnabled = NOабо будь-якими іншими методами, зафіксованими тут.


2
Натрапив на цю нитку, і я був шокований, побачивши стільки інших відповідей до цього. Це, без сумніву, правильний шлях.
бджола

2
Це справді правильна і єдина відповідь, яку слід враховувати. Все, що згадує взаємодію користувачів, є абсолютно невірним.
mattyohe

50

Крім того, можна відключити вибір рядки з інтерфейсу будівельник сам по собі, вибираючи NoSelectionз selectionопції (з UITableView Properties) в панелі інспектора , як показано на малюнку нижче

Інспектор UITableView


2
Найкраще рішення IMHO
Itai Spector

Я часто використовую це рішення
Євсенев,


36

У вашому UITableViewCell«s XIB в Attribute Inspector встановлене значення Selectionдля None.

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


Це саме те, що мені було потрібно. Я все ще хотів сповіщення didSelect ..., але без видимих ​​ознак вибору. Дякую!
Тимофій Тріпп

Рада, що це допомогло! :)
Заїд Патан

35

Якщо ви хочете, щоб вибір лише спалахнув, а не залишався у вибраному стані, ви можете зателефонувати в

didSelectRowAtIndexPath

наступні

[tableView deselectRowAtIndexPath:indexPath animated:YES];

тому він буде спалахувати вибраний стан і повертається назад.


3
При такому підході рядок моментально виділяється, а потім згасає протягом півсекунди. Ось так Apple стилює свої меню налаштувань, тому мені це добре виглядає.
VinceFior

34

У випадку, якщо комусь потрібна відповідь за Swift :

cell.selectionStyle = .None

1
ми також можемо використовувати це cell.selectionStyle = UITableViewCellSelectionStyle.None
ледь

29

Це те, що я використовую, щоб cellForRowAtIndexPathнаписати цей код .:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

28

З UITableViewDelegateпротоколу ви можете використовувати метод, willSelectRowAtIndexPath і return nilякщо ви не хочете, щоб вибраний рядок.

Таким же чином ви можете використовувати willDeselectRowAtIndexPathметод, і return nilякщо ви не хочете, щоб рядок скасував вибір.


5
Мені цей метод не подобається, оскільки він все ще показує клітинку у виділеному стані, поки не торкнеться.
kbanman

2
саме тому мені це подобається :-)
Joris Weimar

24

1- Все, що вам потрібно зробити, це встановити стиль вибору дляUITableViewCell екземпляра, використовуючи:


Завдання-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

або

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];


Швидкий 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None


Швидкий 3:

cell.selectionStyle = .none


2 - Не реалізовуйте - tableView:didSelectRowAtIndexPath:у своєму поданні таблиці delegateабо явно виключайте комірки, у яких ви хочете не робити жодних дій, якщо ви їх реалізуєте.

3 - Далі, ви також можете це зробити з розкадрівки. Клацніть на комірці перегляду таблиці та в інспекторі атрибутів у комірці перегляду таблиці та змініть спадне меню поруч із Виділення на Немає.


4 - Ви можете вимкнути підсвічування комірок таблиці за допомогою наведеного нижче коду в (iOS) Xcode 9, Swift 4.0

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
        cell.selectionStyle = .none
        return cell


}

20

Завдання-C:

  1. Нижче фрагмент відключення підсвічування, але він також відключить виклик didSelectRowAtIndexPath. Тож якщо ви не реалізуєте, didSelectRowAtIndexPathтоді використовуйте метод нижче. Це слід додати під час створення таблиці. Це буде працювати на кнопках і UITextFieldвсередині комірки.

    self.tableView.allowsSelection = NO;
  2. Внизу фрагмента відключення виділення підсвічування, і він не вимикає дзвінок didSelectRowAtIndexPath. Встановіть стиль вибору клітинки "Немає в"cellForRowAtIndexPath

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
  3. Внизу фрагмента вимкніть все, що знаходиться в комірці. Це відключить взаємодія з buttons, textfields:

    self.tableView.userInteractionEnabled = false;

Швидкий:

Нижче наведено Swiftеквівалент вищезазначених Objective-Cрішень:

  1. Заміна першого рішення

    self.tableView.allowsSelection = false
  2. Заміна другого рішення

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
  3. Заміна третього рішення

    self.tableView.userInteractionEnabled = false

19

Спробуйте ввести:

cell.selected = NO;

Він відмінить вибір рядка, коли це буде потрібно.

У Swift3 ...

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let r = indexPath.row
    print("clicked .. \(r)")
    tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true)
}

14

Я теж досить сильно боровся з цим, маючи контроль над своїм UITableViewCellзабороненим використанням userInteractionEnabledмайна. У мене є 3-х стільникова статична таблиця для налаштувань, 2 з датами, 1 з перемикачем включення / вимкнення. Після гри в Storyboard / IB мені вдалося зробити нижній не вибір, але коли ви натиснете його, вибір з одного з верхніх рядів зникає. Ось WIP-зображення моїх налаштувань UITableView:

Налаштування UITableView

Якщо натиснути 3-й рядок, взагалі нічого не відбудеться, вибір залишиться на другому рядку. Функціонал практично є копією екрана вибору часу на додавання часу програми Apple Apple.

Код напрочуд сумісний, аж до IOS2 = /:

- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == 2) {
        return nil;
    }
    return indexPath;
}

Це працює в поєднанні з встановленням жодного стилю вибору, тому клітина не мерехтить при подіях притискання


11

Ми можемо написати код, як

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

але коли у нас є спеціальна клітинка xib над рядком, попереджають на той час для

користувацька клітина xib

нам потрібно встановити стиль вибору None від конструктора інтерфейсів


11

Вам просто потрібно ввести цей код у cellForRowAtIndexPath

Щоб вимкнути властивість вибору комірки: (Під час торкання комірки).

cell.selectionStyle = UITableViewCellSelectionStyle.None

Дякую, у мене є зображення в моїй комірці та надпис над ним. Я встановив фон мітки, але кожен раз, коли я клацав, фон зникав би, це вирішує це.
Дарко

10

спробуйте це

cell.selectionStyle = UITableViewCellSelectionStyleNone;

і

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

а також можна встановити стиль вибору за допомогою інтерфейсу.



7

Хоча це найкраще і найпростіше рішення, щоб запобігти появі рядка під час вибору

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Я також хочу запропонувати, що іноді корисно коротко показати, що рядок вибрано, а потім вимкнути його. Це сповіщає користувачів про підтвердження того, що вони мали намір вибрати:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     [tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}


6

Щоб відключити виділення UItableviewcell

cell.selectionStyle = UITableViewCellSelectionStyleNone;

І не повинен дозволяти користувачеві взаємодіяти з коміркою.

cell.userInteractionEnabled = NO;

6

Ви також можете встановити колір тла на Очистити, щоб досягти такого ж ефекту, як UITableViewCellSelectionStyleNoneу випадку, якщо ви не хочете / не можете використовуватиUITableViewCellSelectionStyleNone .

Ви б використовували код наступного:

UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];

Це може погіршити вашу ефективність, оскільки ви додасте додатковий кольоровий вигляд до кожної комірки.


6

Ви можете використовувати:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

у комірці для рядка за методом шляху індексу вашого UITableView.

Також ви можете використовувати:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

у табличному перегляді didselectrowatindexpath метод.


Це тепер cell.selectionStyle = UITableViewCellSelectionStyle.noneв Swift 3.
Dan

5

Ви можете використовувати це

cell.selectionStyle = UITableViewCellSelectionStyleNone;

5

Можна використовувати….

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];


5
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];

Щасливого кодування !!!


5

Ви також можете зробити це з раскадровки. Клацніть на комірці перегляду таблиці та в інспекторі атрибутів у комірці перегляду таблиці та змініть спадне меню поруч із Виділення на Немає.

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