Ответы:
Задайте для selectionStyle
свойства ячейки таблицы значение UITableViewCellSelectionStyleNone
. Это должно предотвратить его выделение, и вы также можете проверить это свойство в своем tableView:didSelectRowAtIndexPath:
.
Для того, чтобы полностью предотвратить выделение из 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;
}
didSelectRowAtIndexPath
потому willSelectRowAtIndexPath
что в любом случае он будет вызываться всегда.
использовать это:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
didSelectRowAtIndexPath
все еще вызывается.
Только для iOS 6+.
Вы можете реализовать метод
tableView:shouldHighlightRowAtIndexPath:
в своем делегате. Подробнее читайте здесь: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html.
Если бы эта проблема тоже перепробовала все уже упомянутое. Последней уловкой, позволившей избавиться от «синей вспышки» при выборе ячейки таблицы, было добавление такой строки:
self.myTableView.allowsSelection = NO;
Не уверен, была ли это одна линия или все вместе, но в целом я не получил больше синего выделения или даже синей вспышки. Счастливый!
Устанавливать cell.userInteractionEnabled = NO;
Apple говорит, что первое, что вы должны сделать в didSelectRowAtIndexPath, - это отменить выбор строки
[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];
Затем вы можете изменить AccessoryType на галочку или на отсутствие и т. Д. Итак, когда вы вводите didSelectRowAtIndexPath, вы можете отменить выбор строки, и если она не предназначена для выбора, просто не проверяйте эту строку.
Другой способ - добавить в UITableViewCell
. Мне этот ответ нравится больше, чем ответ Себастьяна (тоже хороший), потому что я строю свой стол. Я подумал, что это может быть полезно кому-то другому.
- (void)setSelectable:(BOOL)enabled {
[self setSelectionStyle:UITableViewCellSelectionStyleNone];
[self setUserInteractionEnabled:enabled];
}
- (BOOL)isSelectable {
BOOL disabled = [self selectionStyle]==UITableViewCellSelectionStyleNone &&
[self isUserInteractionEnabled];
return ! disabled;
}
Swift 4:
вы можете предотвратить выбор и выделение с помощью UITableViewDelegate: shouldHighlightRowAt
Этот ответ предполагает, что у вас есть созданная настраиваемая ячейка с именем: CustomTableViewCell
И что вы создали логическое значение внутри этой настраиваемой ячейки с именем: isSelectable
func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
if cell.isSelectable == false {
return false
} else {
return true
}
}
Это Swift-версия ответа Objc Себастьяна Селиса.
Есть еще один простой способ избежать выделения синего цвета.
Выберите ячейку, которая не должна отображаться синим цветом.
Затем выберите инспектор атрибутов (значок щита рядом со значком линейки на панели свойств сбоку).
Затем измените значение поля «Выбор» с «Синего» на «Нет».
Обратите внимание: по-видимому, он все еще выбирается, он просто не будет отображаться как выбранный, если все, что вы хотите, - это избежать эффекта пользовательского интерфейса.
Используйте tableView: willDisplayCell: forRowAtIndexPath: вместо tableView: didSelectRowAtIndexPath:, чтобы избавиться от вспышки, которая появляется при первом прикосновении к ячейке.
- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
Чтобы сделать определенную строку невыделенной, вам необходимо внести некоторые изменения в два метода делегата 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;
строка все равно будет выбрана, и есть вероятность сбоя приложения
tableView:shouldHighlightRowAtIndexPath:
как отмечает Аюш ниже