Как отключить выбор одной ячейки в UITableView? У меня несколько, и я хочу, чтобы последний был отключен.
Отключить выбор одного UITableViewCell
Ответ 1
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = ...
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
Ответ 2
Чтобы остановить только выбранные ячейки, используйте:
cell.userInteractionEnabled = NO;
Помимо предотвращения выбора, это также останавливает tableView: didSelectRowAtIndexPath: вызывается для ячеек, которые он установил. Он также сделает озвучку обработкой так же, как и тусклую кнопку (которая может быть или не быть тем, что вы хотите).
Обратите внимание, что если у вас есть интерактивные элементы в ячейке (т.е. переключатели/кнопки), вам нужно будет использовать cell.selectionStyle = UITableViewCellSelectionStyleNone;
вместо этого, а затем обязательно проигнорировать отводы в ячейке в tableView:didSelectRowAtIndexPath:
.
Ответ 3
Бросьте это в свою собственную таблицу VC:
// cells lacking UITableViewCellAccessoryDisclosureIndicator will not be selectable
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
if (cell.accessoryType != UITableViewCellAccessoryDisclosureIndicator) {
return nil;
}
return indexPath;
}
// disabled cells will still have userinteraction enabled for their subviews
- (void)setEnabled:(BOOL)enabled forTableViewCell:(UITableViewCell *)tableViewCell
{
tableViewCell.accessoryType = (enabled) ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone;
// if you dont want the blue selection on tap, comment out the following line
tableViewCell.selectionStyle = (enabled) ? UITableViewCellSelectionStyleBlue : UITableViewCellSelectionStyleNone;
}
Затем, чтобы включить/отключить выделение для someTableViewCell, сделайте следующее:
[self setEnabled:state forTableViewCell:someTableViewCell];
Вы закончили и можете отправить.
Ответ 4
-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([self numberOfRowsInSection] == [indexPath row]) {
return nil;
} else {
return indexPath;
}
}
последняя строка таблицы не будет выбрана
Ответ 5
Как я уже упоминал в другом потоке, все вышеперечисленные методы не решают проблему точно. Правильный способ отключения ячейки осуществляется с помощью метода
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
и в этом методе нужно использовать
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
который отключает выбор ячейки, но все же позволяет пользователю взаимодействовать с подзонами ячейки, такими как UISwitch.
Ответ 6
Самое чистое решение, которое я нашел для этого, использует только метод делегата willDisplayCell.
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if([indexPath row] == 0) //<-----ignores touches on first cell in the UITableView
{ //simply change this around to suit your needs
cell.userInteractionEnabled = NO;
cell.textLabel.enabled = NO;
cell.detailTextLabel.enabled = NO;
}
}
Вам не нужно предпринимать никаких дальнейших действий в методе делегирования didSelectRowAtIndexPath, чтобы гарантировать, что выбор этой ячейки игнорируется. Все касания этой ячейки будут проигнорированы, а текст в ячейке будет также выделен.
Ответ 7
с iOS 6.
Вы можете использовать следующий метод делегата и вернуть NO
в случае, если вы его не выбрали, и YES
в случае, если вы хотите его выбрать.
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
return indexPath.section == 0;
}
Ответ 8
Попробуйте это быстро:
self.tableView.deselectRowAtIndexPath(indexPath, animated: true)
Ответ 9
Если кто-то задается вопросом, как это сделать быстро, то вот мой код. Я использую Xcode 7 и тестирую iPad Retina (iOS 9).
cell.selectionStyle = UITableViewCellSelectionStyle .None
cell.userInteractionEnabled = false
Попробуйте поместить этот двухстрочный код, хотите ли вы. В моем случае я использовал это в этом методе для отображения ячеек.
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)
Помните, что этот двухстрочный код блокирует любой вид выбора или взаимодействия с вашими ячейками, но вы можете использовать только первую линию, если хотите. Это...
cell.selectionStyle = UITableViewCellSelectionStyle .None
Только эта строка блокирует выбор в ваших ячейках.
Однако вторая строка сделает ячейку "Только для чтения". То есть..
cell.userInteractionEnabled = false
Спасибо
Надеюсь, это помогло.