Как отменить выбор выбранной ячейки UITableView? - PullRequest
199 голосов
/ 19 октября 2010

Я работаю над проектом, в котором мне нужно предварительно выбрать конкретную ячейку.

Я могу предварительно выбрать ячейку, используя -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];
}

Вы можете помочь?

Ответы [ 23 ]

392 голосов
/ 19 октября 2010

используйте этот код

- (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)
}
116 голосов
/ 24 мая 2012

Используйте следующий метод в табличном представлении делегата didSelectRowAtIndexpath (или из любого места)

[myTable deselectRowAtIndexPath:[myTable indexPathForSelectedRow] animated:YES];
37 голосов
/ 27 февраля 2013

Попробуйте это:

for (NSIndexPath *indexPath in tableView.indexPathsForSelectedRows) {
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
}
28 голосов
/ 19 октября 2010

Пожалуйста, уточните метод делегата, является ли он правильным или нет. Например;

-(void) tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath

для

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
23 голосов
/ 23 марта 2016

Для этого может быть полезно сделать расширение в 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)
}
22 голосов
/ 04 декабря 2015

Swift 4:

tableView.deselectRow(at: indexPath, animated: true)
11 голосов
/ 06 августа 2014

В дополнение к настройке выбранной ячейки, вам также нужно сообщить tableView, что ячейка выбрана. Добавьте вызов к -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 голосов
/ 07 июня 2018

Это решение для 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
}
6 голосов
/ 25 июля 2012

Основываясь на решении Сайкиранса, я написал это, что мне помогло. В файле .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;

Я тоже не очень опытен, так что дважды проверь на утечки памяти и т.д.

6 голосов
/ 29 августа 2013

Если вы хотите выбрать любую ячейку таблицы с первым щелчком мыши и отменить выбор со вторым, вы должны использовать этот код:

- (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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...