Как отключить выбор UITableView?
при нажатии на строку UITableView
, строка подсвечивается и выбирается. Можно ли отключить это, чтобы нажатие строки ничего не делало?
30 ответов
для меня отлично работало следующее:
tableView.allowsSelection = NO;
это значит didSelectRowAt#
просто не будет работать. То есть прикосновение к ряду стола, как таковому, абсолютно ничего не сделает. (И, следовательно, очевидно, что никогда не будет выбранной анимации.)
(обратите внимание, что если на ячейках у вас есть UIButton
или любые другие элементы управления, конечно, эти элементы управления будут работать. Любые элементы управления, которые у вас есть в ячейке таблицы, полностью не связаны с UITableView возможность позволить вам "выбрать строку", используя didSelectRowAt#
.)
все, что вам нужно сделать, это задать стиль выделения на UITableViewCell
экземпляр с помощью:
Цель-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
или
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift 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
подводя итог тому, что я считаю правильными ответами, основанными на моем собственном опыте в реализации этого:
если вы хотите отключить выделение только для некоторых ячеек, используйте:
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 документация.)
этот метод позволяет отмечать определенные строки как unhighlightable (и неявно, неизбираемые) без необходимости изменять стиль выбора ячейки, возясь с обработкой событий ячейки с помощью userInteractionEnabled = NO
, или любые другие методы, описанные здесь.
вы также можете отключить выбор строки из самого interface builder, выбрав NoSelection
с selection
опция (свойств UITableView) в панели инспектора, как показано на рисунке ниже
Если вы хотите, чтобы выбор только мигал, а не оставался в выбранном состоянии, вы можете позвонить в
didSelectRowAtIndexPath
следующее
[tableView deselectRowAtIndexPath:indexPath animated:YES];
Так он будет мигать выбранное состояние и вернуться.
С UITableViewDelegate
протокол вы можете использовать метод willSelectRowAtIndexPath
и return nil
Если вы не хотите, чтобы строки выбраны.
таким же образом вы можете использовать willDeselectRowAtIndexPath
способ и return nil
Если вы не хотите, чтобы строки, чтобы отменить.
Это то, что я использую :
cell.selectionStyle = UITableViewCellSelectionStyleNone;
в cellForRowAtIndexPath напишите этот код.
попробуй типа:
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)
}
Цель-C:
-
ниже фрагмент отключить выделение, но он также отключить вызов
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
я боролся с этим довольно обильно, имея контроль в моем UITableViewCell
запрещено использование userInteractionEnabled
собственность. У меня есть 3 ячейки статической таблицы для настроек, 2 с датами, 1 с включением/выключением. После игры в раскадровке / IB мне удалось сделать нижний не выбираемым, но при нажатии на него выбор из одной из верхних строк исчезает. Вот изображение WIP моих настроек UITableView:
Если вы нажмете 3-ю строку ничего в любом случае, выбор останется на втором ряду. Функциональность практически является копией экрана выбора времени добавления событий приложения календаря Apple.
код удивительно совместим, вплоть до IOS2 =/:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
это работает в сочетании с установкой стиля выбора в none, поэтому ячейка не мерцает при касании событий
мы можем написать код типа
cell.selectionStyle = UITableViewCellSelectionStyleNone;
но когда у нас есть пользовательские ячейки xib строку предупредить в это время
пользовательские ячейки xib
нужно установить стиль выбора нет из построителя интерфейса
вам просто нужно поместить этот код в cellForRowAtIndexPath
отключить свойство выбора ячейки:(при нажатии на ячейку).
cell.selectionStyle = UITableViewCellSelectionStyle.None
попробуй такое
cell.selectionStyle = UITableViewCellSelectionStyleNone;
и
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
и вы также можете установить стиль выбора с помощью interfacebuilder.
хотя это лучшее и простое решение для предотвращения отображения строки во время выделения
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];
Это может деградируют ваша производительность в качестве добавления extra цвета просмотра на каждого ячейки.
чтобы отключить подсветку UItableviewcell
cell.selectionStyle = UITableViewCellSelectionStyleNone;
и не должен позволять пользователю взаимодействовать с ячейкой.
cell.userInteractionEnabled = NO;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
удачи в кодировании !!!
вы также можете сделать это в раскадровке. Щелкните ячейку представление таблицы и в инспекторе атрибутов в ячейке представление таблицы измените раскрывающийся список рядом с выделением на нет.
быстрое решение с пользовательской ячейкой:
import Foundation
class CustomTableViewCell: UITableViewCell
{
required init(coder aDecoder: NSCoder)
{
fatalError("init(coder:) has not been implemented")
}
override init(style: UITableViewCellStyle, reuseIdentifier: String?)
{
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.selectionStyle = UITableViewCellSelectionStyle.None
}
}
можно использовать selectionStyle собственность UITableViewCell
cell.selectionStyle = UITableViewCellSelectionStyleNone;
или
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
кроме того, не реализуйте ниже делегата
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }
Если вы создали Xib / раскадровка файл, то вы можете изменить setUserInteractionEnabled свойство tableview to нет, сняв его. Это сделает ваш tableview доступным только для чтения.