Как отменить выбор выбранной ячейки UITableView?
Я работаю над проектом, на котором я должен предварительно выделить конкретную ячейку.
Я могу предварительно выделить ячейку с помощью -willDisplayCell
, но я не могу отменить ее, когда пользователь нажимает на любую другую ячейку.
- (void)tableView:(UITableView*)tableView
willDisplayCell:(UITableViewCell*)cell
forRowAtIndexPath:(NSIndexPath*)indexPath
{
AppDelegate_iPad *appDelegte =
(AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];
if ([appDelegte.indexPathDelegate row] == [indexPath row])
{
[cell setSelected:YES];
}
}
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
AppDelegate_iPad *appDelegte =
(AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];
NSIndexPath *indexpath1 = appDelegte.indexPathDelegate;
appDelegte.indexPathDelegate = indexPath;
[materialTable deselectRowAtIndexPath:indexpath1 animated:NO];
}
Вы можете помочь?
Ответы
Ответ 1
используйте этот код
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//Change the selected background view of the cell.
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
Swift 3.0:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//Change the selected background view of the cell.
tableView.deselectRow(at: indexPath, animated: true)
}
Ответ 2
Используйте следующий метод в делегате представления таблиц didSelectRowAtIndexpath
(или из любого места)
[myTable deselectRowAtIndexPath:[myTable indexPathForSelectedRow] animated:YES];
Ответ 3
Попробуйте следующее:
for (NSIndexPath *indexPath in tableView.indexPathsForSelectedRows) {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
}
Ответ 4
Пожалуйста, проверьте с помощью метода делегата, правильно оно или нет. Например:
-(void) tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
для
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
Ответ 5
Для этого может быть полезно сделать расширение в Swift.
Swift 4:
Расширение Swift (например, в файле UITableViewExtension.swift):
import UIKit
extension UITableView {
func deselectSelectedRow(animated: Bool)
{
if let indexPathForSelectedRow = self.indexPathForSelectedRow
{
self.deselectRow(at: indexPathForSelectedRow, animated: animated)
}
}
}
Используйте например:
override func viewWillAppear(_ animated: Bool)
{
super.viewWillAppear(animated)
self.tableView.deselectSelectedRow(animated: true)
}
Ответ 6
Swift 4:
tableView.deselectRow(at: indexPath, animated: true)
Ответ 7
В дополнение к настройке ячейки как выбранной, вам также необходимо сообщить в таблицуView, что ячейка выбрана. Добавьте вызов -tableView:selectRowAtIndexPath:animated:scrollPosition:
к вашему методу willDisplayCell:
: и вы сможете отменить его как обычно.
- (void)tableView:(UITableView*)tableView
willDisplayCell:(UITableViewCell*)cell
forRowAtIndexPath:(NSIndexPath*)indexPath
{
AppDelegate_iPad *appDelegte = (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];
if ([appDelegte.indexPathDelegate row] == [indexPath row])
{
// SELECT CELL
[cell setSelected:YES];
// TELL TABLEVIEW THAT ROW IS SELECTED
[tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
}
}
Обязательно используйте UITableViewScrollPositionNone, чтобы избежать нечетного поведения прокрутки.
Ответ 8
Это решение для Swift 4
in tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
просто добавь
tableView.deselectRow(at: indexPath, animated: true)
это работает как шарм
пример:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
//some code
}
Ответ 9
Это должно работать:
[tableView deselectRowAtIndexPath:indexpath1 animated:NO];
Просто убедитесь, что materialTable и tableView указывают на один и тот же объект.
Связаны ли материалы с табличным представлением в Interface Builder?
Ответ 10
Основываясь на решении сайкиран, я написал это, что помогло мне. В файле .m:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if(selectedRowIndex && indexPath.row == selectedRowIndex.row) {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
selectedRowIndex = nil;
}
else { self.selectedRowIndex = [indexPath retain]; }
[tableView beginUpdates];
[tableView endUpdates];
}
И в файле заголовка:
@property (retain, nonatomic) NSIndexPath* selectedRowIndex;
Я тоже не очень опытен, поэтому дважды проверяйте утечки памяти и т.д.
Ответ 11
Если вы хотите выбрать любую ячейку таблицы с первым щелчком и отменить выбор со второго, вы должны использовать этот код:
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (self.selectedIndexPath &&
[indexPath compare:self.selectedIndexPath] == NSOrderedSame) {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
self.selectedIndexPath = nil;
}
else {
self.selectedIndexPath = indexPath;
}
}
Ответ 12
Swift 4:
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
let cell = tableView.cellForRow(at: indexPath)
if cell?.isSelected == true { // check if cell has been previously selected
tableView.deselectRow(at: indexPath, animated: true)
return nil
} else {
return indexPath
}
}
Ответ 13
Swift 2.0:
tableView.deselectRowAtIndexPath(indexPath, animated: true)
Ответ 14
попробуйте это
[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
Ответ 15
NSIndexPath * index = [self.menuTableView indexPathForSelectedRow];
[self.menuTableView deselectRowAtIndexPath:index animated:NO];
поместите этот код в соответствии с вашим кодом, и вы отключите свою ячейку.
Ответ 16
Вы можете попробовать это?
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
AppDelegate_iPad *appDelegte =
(AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];
NSIndexPath *indexpath1 = appDelegte.indexPathDelegate;
appDelegte.indexPathDelegate = indexPath;
UITableViewCell *prevSelectedCell = [tableView cellForRowAtIndexPath: indexpath1];
if([prevSelectedCell isSelected]){
[prevSelectedCell setSelected:NO];
}
}
Это сработало для меня.
Ответ 17
Swift 3.0:
После раздела протокола соответствия руководства по быстрому стилю ray wenderlich, чтобы сгруппировать связанные методы, добавьте это расширение ниже класса контроллера вида например:
// your view controller
class MyViewcontroller: UIViewController {
// class stuff here
}
// MARK: - UITableViewDelegate
extension MyViewcontroller: UITableViewDelegate {
// use the UITableViewDelegate method tableView(_:didSelectRowAt:)
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// your code when user select row at indexPath
// at the end use deselectRow
tableView.deselectRow(at: indexPath, animated: true)
}
}
Ответ 18
Swift
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
// your code
// your code
// and use deselect row to end line of this function
self.tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
Ответ 19
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}
Ответ 20
Swift 3
Я тоже столкнулся с этим - когда вы перемещаетесь или отворачиваетесь назад к представлению таблицы, он обычно не отменяет выбранную ранее для вас строку. Я помещаю этот код в контроллер табличного представления, и он работает хорошо:
override func viewDidAppear(_ animated: Bool) {
if let lastSelectedRow = tableView.indexPathForSelectedRow {
tableView.deselectRow(at: lastSelectedRow, animated: true)
}
}
Ответ 21
Swift 3/4
В ViewController:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}
В пользовательской ячейке:
override func awakeFromNib() {
super.awakeFromNib()
selectionStyle = .none
}
Ответ 22
swift 3.0
tableView.deselectRow(at: indexPath, animated: true)
Ответ 23
Отменить выделение (DidDeselectRowAt) при первом нажатии из-за предварительно загруженных данных; вам нужно сообщить tableView, что строка уже выбрана для начала, так что первоначальный щелчок затем отменяет выбор строки:
//Swift 3:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if tableView[indexPath.row] == "data value"
tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none)
}
}
Ответ 24
Я обнаружил, что помимо установки ячейки в качестве выбранной, вы должны сообщить табличному представлению, чтобы выбрать строку по заданному пути индекса.
// Swift 3+
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if appDelegate.indexPathDelegate.row == indexPath.row {
self.tableView.selectRow(at: indexPath, animated: true, scrollPosition: .none)
cell.setSelected(true, animated: true)
}
}