Коли ви натискаєте рядок у UITableView, рядок виділяється та вибирається. Чи можна відключити це, якщо торкнення рядка нічого не робить?
Коли ви натискаєте рядок у UITableView, рядок виділяється та вибирається. Чи можна відключити це, якщо торкнення рядка нічого не робить?
Відповіді:
Для мене добре працювали:
tableView.allowsSelection = false
Це означає, що didSelectRowAt#просто не вийде. Тобто, торкаючись до ряду столу, як такого, не буде робити нічого. (Отже, очевидно, ніколи не буде вибраної анімації.)
(Зверніть увагу, що якщо у клітинках у вас є UIButtonчи будь-які інші елементи управління, звичайно, ці елементи контролю все ще працюватимуть. Будь-які елементи керування, які у вас трапляються у комірці таблиці, абсолютно не пов'язані зі здатністю UITableView дозволяти "вибирати рядок" використовуючи didSelectRowAt#.)
Ще один момент, який слід зазначити: це не працює, коли UITableViewперебуває в режимі редагування. Для обмеження вибору комірок в режимі редагування використовуйте код, як показано нижче:
tableView.allowsSelectionDuringEditing = false
selectionStyleвластивість у комірці: cell.selectionStyle = UITableViewCellSelectionStyle.Noneу Swift або cell.selectionStyle = UITableViewCellSelectionStyleNoneу Objective-C.
tableView.allowSelection = false
tableViewDidSelectRowAtIndexPathпотрібно викликати, cell.selectionStyle = .Noneбажано. Якщо ви не хочете або не турбуєтесь про те, щоб викликати функцію делегата (тобто мати текстове поле у таблиціViewCell), tableView.allowsSelection = falseце просто чудово.
Все, що вам потрібно зробити, це встановити стиль вибору для UITableViewCellекземпляра, використовуючи:
Завдання-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
або
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Швидкий 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3 і 4.x:
cell.selectionStyle = .none
Крім того, переконайтеся, що ви або не реалізуєте -tableView:didSelectRowAtIndexPath:у своєму представнику таблиці таблицю або явно виключаєте комірки, з якими ви хочете не робити жодних дій, якщо ви їх реалізуєте.
Оскільки я нещодавно прочитав цю публікацію, і це мені допомогло, я хотів опублікувати ще одну відповідь, щоб закріпити всі відповіді (для нащадків).
Отже, насправді є 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
tableView:shouldHighlightRowAtIndexPath:, що, як правило, (не завжди) є моїм кращим підходом.
Підводячи підсумки, я вважаю, що це правильні відповіді на основі мого власного досвіду в цьому:
Якщо ви хочете відключити вибір лише для деяких комірок, скористайтеся:
cell.userInteractionEnabled = NO;
Окрім запобігання вибору, це також зупиняє виклик tableView: didSelectRowAtIndexPath: для викликів для комірок, у яких його встановлено. (За цю відповідь заслуговує Тоні Мільйон, дякую!)
Якщо у ваших клітинках є кнопки, на які потрібно натиснути, вам потрібно:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
і вам також потрібно ігнорувати будь-які клацання клітинки в - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath.
Якщо ви хочете відключити вибір для всієї таблиці, використовуйте:
tableView.allowsSelection = NO;
(Заслуга Пауло Де Баррос, спасибі!)
Станом на iOS 6.0, UITableViewDelegateмає tableView:shouldHighlightRowAtIndexPath:. (Про це читайте в Документації на iOS .)
Цей метод дозволяє позначити конкретні рядки як непросвічувані (і неявно, невибрані), не змінюючи стиль вибору комірки, возитися з обробкою події комірки userInteractionEnabled = NOабо будь-якими іншими методами, зафіксованими тут.
Крім того, можна відключити вибір рядки з інтерфейсу будівельник сам по собі, вибираючи NoSelectionз selectionопції (з UITableView Properties) в панелі інспектора , як показано на малюнку нижче

ФІКСОВАНЕ РІШЕННЯ ДЛЯ SWIFT 3
cell.selectionStyle = .none
Якщо ви хочете, щоб вибір лише спалахнув, а не залишався у вибраному стані, ви можете зателефонувати в
didSelectRowAtIndexPath
наступні
[tableView deselectRowAtIndexPath:indexPath animated:YES];
тому він буде спалахувати вибраний стан і повертається назад.
Це те, що я використовую, щоб cellForRowAtIndexPathнаписати цей код .:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
З UITableViewDelegateпротоколу ви можете використовувати метод, willSelectRowAtIndexPath
і return nilякщо ви не хочете, щоб вибраний рядок.
Таким же чином ви можете використовувати willDeselectRowAtIndexPathметод, і return nilякщо ви не хочете, щоб рядок скасував вибір.
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
}
Нижче фрагмент відключення підсвічування, але він також відключить виклик didSelectRowAtIndexPath. Тож якщо ви не реалізуєте, didSelectRowAtIndexPathтоді використовуйте метод нижче. Це слід додати під час створення таблиці. Це буде працювати на кнопках і UITextFieldвсередині комірки.
self.tableView.allowsSelection = NO;Внизу фрагмента відключення виділення підсвічування, і він не вимикає дзвінок didSelectRowAtIndexPath. Встановіть стиль вибору клітинки "Немає в"cellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;Внизу фрагмента вимкніть все, що знаходиться в комірці. Це відключить взаємодія з buttons, textfields:
self.tableView.userInteractionEnabled = false;Нижче наведено Swiftеквівалент вищезазначених Objective-Cрішень:
Заміна першого рішення
self.tableView.allowsSelection = falseЗаміна другого рішення
cell?.selectionStyle = UITableViewCellSelectionStyle.NoneЗаміна третього рішення
self.tableView.userInteractionEnabled = falseСпробуйте ввести:
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)
}
Я теж досить сильно боровся з цим, маючи контроль над своїм UITableViewCellзабороненим використанням userInteractionEnabledмайна. У мене є 3-х стільникова статична таблиця для налаштувань, 2 з датами, 1 з перемикачем включення / вимкнення. Після гри в Storyboard / IB мені вдалося зробити нижній не вибір, але коли ви натиснете його, вибір з одного з верхніх рядів зникає. Ось WIP-зображення моїх налаштувань UITableView:

Якщо натиснути 3-й рядок, взагалі нічого не відбудеться, вибір залишиться на другому рядку. Функціонал практично є копією екрана вибору часу на додавання часу програми Apple Apple.
Код напрочуд сумісний, аж до IOS2 = /:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
Це працює в поєднанні з встановленням жодного стилю вибору, тому клітина не мерехтить при подіях притискання
Вам просто потрібно ввести цей код у cellForRowAtIndexPath
Щоб вимкнути властивість вибору комірки: (Під час торкання комірки).
cell.selectionStyle = UITableViewCellSelectionStyle.None
Я використовую це, що працює для мене.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Хоча це найкраще і найпростіше рішення, щоб запобігти появі рядка під час вибору
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Я також хочу запропонувати, що іноді корисно коротко показати, що рядок вибрано, а потім вимкнути його. Це сповіщає користувачів про підтвердження того, що вони мали намір вибрати:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
Ви також можете встановити колір тла на Очистити, щоб досягти такого ж ефекту, як UITableViewCellSelectionStyleNoneу випадку, якщо ви не хочете / не можете використовуватиUITableViewCellSelectionStyleNone .
Ви б використовували код наступного:
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
Це може погіршити вашу ефективність, оскільки ви додасте додатковий кольоровий вигляд до кожної комірки.
Ви можете використовувати:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
у комірці для рядка за методом шляху індексу вашого UITableView.
Також ви можете використовувати:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
у табличному перегляді didselectrowatindexpath метод.
cell.selectionStyle = UITableViewCellSelectionStyle.noneв Swift 3.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Щасливого кодування !!!
selection, і, звичайно,highlightingвідключають це. Багато відповідей з високим рівнем пояснення пояснюють, якdisable selectionвідмовитись від заборониhighlighting. Щоб вимкнути лише використання підсвічування,cell.selectionStyle = .Noneперейдіть наstoryboard / cell / Selection = None