Відповіді:
Встановіть 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
}
}
Це швидка версія відповіді Себастьяна Селіса.
Є ще один простий спосіб уникнути того, що виділення виглядають синіми.
Виберіть клітинку, яку ви не хочете виглядати синьою.
Потім виберіть інспектор атрибутів (значок екрана поруч із лінією лінійки на панелі перегляду властивостей збоку).
Потім змініть поле "Вибір" з "Синього" на "Нічого".
Зауважте, імовірно, це все ще вибирається, воно просто не відображатиметься як вибране, якщо все, що вам потрібно, це уникнути ефекту інтерфейсу користувача.
Використовуйте 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:
як відмітив