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?
utiliser ce code
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//Change the selected background view of the cell.
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//Change the selected background view of the cell.
tableView.deselectRow(at: indexPath, animated: true)
}
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];
Essaye ça:
for (NSIndexPath *indexPath in tableView.indexPathsForSelectedRows) {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
}
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
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)
}
Swift 4:
tableView.deselectRow(at: indexPath, animated: true)
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.
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
}
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?
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;
}
}
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.
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
}
}
Swift 2.0:
tableView.deselectRowAtIndexPath(indexPath, animated: true)
essaye ça
[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
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.
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.
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)
}
}
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
}
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)
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}
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)
}
}
Swift 3.
tableView.deselectRow(at: indexPath, animated: true)
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)
}
}
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)
}
}