Как я могу установить свойство ячейки UITableView не поддающимся выбору? Я не хочу видеть этот синий блок выбора, когда пользователь нажимает на ячейку.
UITableView Установка некоторых ячеек как "невыбираемых"
Ответ 1
Установите для свойства ячейки таблицы selectionStyle
значение UITableViewCellSelectionStyleNone
. Это должно помешать подсветке, и вы также можете проверить это свойство в tableView:didSelectRowAtIndexPath:
.
Ответ 2
Чтобы запретить выбор строк
Чтобы полностью предотвратить выбор 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;
}
Ответ 3
используйте это:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Ответ 4
Только для iOS 6+.
Вы можете реализовать метод
tableView:shouldHighlightRowAtIndexPath:
в вашем делегате.
Подробнее здесь: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html
Ответ 5
Если бы эта проблема тоже попробовала все, что уже упоминалось. Окончательный трюк, который избавился от "синей вспышки" при выборе ячейки таблицы, добавил эту строку:
self.myTableView.allowsSelection = NO;
Не уверен, что это была одна линия или все вместе, но в качестве итогового результата я не получаю больше синего цвета или даже синей вспышки. Happy!
Ответ 6
Установить cell.userinteractionenabled = FALSE;
Ответ 7
Apple говорит, что первое, что вы должны сделать в didSelectRowAtIndexPath, - это отменить выбор строки
[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];
Затем вы можете изменить AccessoryType как галочку, или нет, и т.д. Поэтому, когда вы входите в didSelectRowAtIndexPath, вы можете отменить выбор строки, и если она не предназначена для выбора, просто не проверяйте эту строку.
Ответ 8
Другой способ - добавить несколько методов категорий к UITableViewCell
. Мне это нравится лучше, чем Себастьян (также хороший), потому что я строю свой стол. Я думал, что это может быть полезно кому-то другому.
- (void)setSelectable:(BOOL)enabled {
[self setSelectionStyle:UITableViewCellSelectionStyleNone];
[self setUserInteractionEnabled:enabled];
}
- (BOOL)isSelectable {
BOOL disabled = [self selectionStyle]==UITableViewCellSelectionStyleNone &&
[self isUserInteractionEnabled];
return ! disabled;
}
Ответ 9
использование IB также является элегантным способом:
Ответ 10
Если вы создали свою ячейку в Interface Builder, вы можете сделать это, сняв флажок из User Interaction Enabled "для tableViewCell
.
Ответ 11
Существует еще один простой способ избежать выбора, отображаемого как синий.
Выберите ячейку, которую вы не хотите отображать как синий.
Затем выберите инспектор атрибутов (значок экрана рядом с значком линейки в представлении свойств сбоку).
Затем измените поле "Выбор" с "Синего" на "Нет".
Обратите внимание, что, по-видимому, это выбор, он просто не будет отображаться как выбранный, если все, что вам нужно, - это избежать эффекта пользовательского интерфейса.
Ответ 12
Чтобы сделать определенную строку невыбранной, вам нужно внести некоторые изменения в два метода делегата 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;
строка будет по-прежнему выбрана, и есть вероятность сбоя приложения
Ответ 13
Использование tableView: willDisplayCell: forRowAtIndexPath: вместо tableView: didSelectRowAtIndexPath: чтобы избавиться от флэш-памяти, которая появляется в первый раз, когда вы касаетесь ячейки.
- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}