Коли ви натискаєте рядок у 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