web-dev-qa-db-fra.com

Comment désélectionner une cellule UITableView sélectionnée?

Je travaille sur un projet sur lequel je dois présélectionner une cellule particulière.

Je peux présélectionner une cellule à l'aide de -willDisplayCell, mais je ne peux pas la désélectionner lorsque l'utilisateur clique sur une autre cellule.

- (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];
}

Pouvez vous aider?

202
Ram

utiliser ce code

- (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)
}
393
Saikiran K

Utilisez la méthode suivante dans la vue de table du délégué didSelectRowAtIndexpath (Ou de n'importe où)

[myTable deselectRowAtIndexPath:[myTable indexPathForSelectedRow] animated:YES];
116
Shamitha

Essaye ça:

for (NSIndexPath *indexPath in tableView.indexPathsForSelectedRows) {
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
}
37
ikosdroid

Veuillez vérifier avec la méthode déléguée si elle est correcte ou non. Par exemple;

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

for

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
28
jfalexvijay

Il peut être utile de créer une extension dans Swift pour cela.

Swift 4:

Extension Swift (par exemple, dans un fichier UITableViewExtension.Swift):

import UIKit

extension UITableView {

    func deselectSelectedRow(animated: Bool)
    {
        if let indexPathForSelectedRow = self.indexPathForSelectedRow
        {
            self.deselectRow(at: indexPathForSelectedRow, animated: animated)
        }
    }

}

Utilisez par exemple:

override func viewWillAppear(_ animated: Bool)
{
    super.viewWillAppear(animated)

    self.tableView.deselectSelectedRow(animated: true)
}
23
Thomas Neuteboom

Swift 4:

tableView.deselectRow(at: indexPath, animated: true)
22
Andrea.Ferrando

En plus de définir la cellule comme sélectionnée, vous devez également informer la tableView que la cellule est sélectionnée. Ajoutez un appel à -tableView:selectRowAtIndexPath:animated:scrollPosition: à votre méthode willDisplayCell:: vous pourrez alors le désélectionner normalement.

- (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];   
    } 
}

Veillez à utiliser UITableViewScrollPositionNone pour éviter tout comportement étrange de défilement.

11
Drew C

C'est une solution pour Swift 4

 in tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)

il suffit d'ajouter

tableView.deselectRow(at: indexPath, animated: true)

il fonctionne comme un charme

exemple:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
//some code
}
9
tBug

Cela devrait fonctionner:

[tableView deselectRowAtIndexPath:indexpath1 animated:NO];

Assurez-vous simplement que materialTable et tableView pointent sur le même objet.

Les matériaux sont-ils connectés à la table dans Interface Builder?

6
Jordan

Si vous souhaitez sélectionner une cellule de tableau avec le premier clic et désélectionner avec la seconde, vous devez utiliser ce code:

- (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;
    }
}
6
CHiP-love-NY

Basé sur la solution saikirans, j’ai écrit ceci, ce qui m’a aidé. Sur le fichier .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];

}

Et sur le fichier d'en-tête:

@property (retain, nonatomic) NSIndexPath* selectedRowIndex;

Je ne suis pas très expérimenté non plus, alors vérifiez bien les fuites de mémoire, etc.

6
Yunus Nedim Mehel

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
    }
}
5
Serguei Vinnitskii

Swift 2.0:

tableView.deselectRowAtIndexPath(indexPath, animated: true)
4
Anit Kumar

essaye ça

[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
3
EnasAZ

Pouvez-vous essayer ceci?

- (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];
    }
}

Cela a fonctionné pour moi.

3
Dattatraya Anarase
NSIndexPath * index = [self.menuTableView indexPathForSelectedRow];
[self.menuTableView deselectRowAtIndexPath:index animated:NO];

placez ce code en fonction de votre code et vous obtiendrez votre cellule désélectionnée.

3
rahulchona

Swift 3.0:

Après la section section de conformité du protocole du guide de style de ray wenderlich Swift =, pour conserver les méthodes associées regroupées, placez cette extension sous votre classe de contrôleur de vue de la manière suivante:

// 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)
    }
}
2
ronatory

Swift 3/4

Dans ViewController:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}

Dans une cellule personnalisée:

override func awakeFromNib() {
    super.awakeFromNib()
    selectionStyle = .none
}
1
Sevy11

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)

}
1
Programer_saeed
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}
1
Aayushi

Swift 3

Je me suis également heurté à ce problème. Lorsque vous naviguez ou que vous vous détachez dans la vue tableau, il ne désélectionne généralement pas la ligne précédemment sélectionnée. J'ai mis ce code dans le contrôleur de vue de table et cela fonctionne bien:

override func viewDidAppear(_ animated: Bool) {
    if let lastSelectedRow = tableView.indexPathForSelectedRow {
        tableView.deselectRow(at: lastSelectedRow, animated: true)
    }
}
1
Trev14

Swift 3.

    tableView.deselectRow(at: indexPath, animated: true)
0
Marcelo Gracietti

Désélectionner (DidDeselectRowAt) lorsque vous cliquez pour la première fois en raison de données préchargées; vous devez informer la tableView que la ligne est déjà sélectionnée pour commencer, de sorte qu'un clic initial désélectionne ensuite la ligne:

// 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)

    }
}
0
Arkelyan

Ce que j'ai trouvé, c'est qu'en plus de définir la cellule comme sélectionné, vous devez laisser la vue sous forme de table savoir select la ligne du chemin d'index donné.

// 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)
    }
}
0
David Para