web-dev-qa-db-fra.com

UITableViewCell Set sélectionné initialement

Salut, j'ai une situation où dans une application iPad mon master controller a une liste et contrôleur de détails a ses détails, un modèle typique de UISplitViewController. Ce que je veux réaliser, c'est que ma première ligne doit être initialement sélectionnée et plus tard, je veux donner le choix de sélection à l'utilisateur. J'utilise la cellule setSelected et dans la méthode didSelectRowAtIndexPath pour supprimer la sélection comme celle-ci.

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
    NSIndexPath* path = [NSIndexPath indexPathForRow:0 inSection:0];
    UITableViewCell* cell = [tableView cellForRowAtIndexPath:path];
    [cell setSelected:NO];
} 

pour la cellule initiale mais ma cellule aucune est sélectionnée après cela, veuillez m'aider.

38
Sagar In

essaye ça

NSIndexPath* selectedCellIndexPath= [NSIndexPath indexPathForRow:0 inSection:0];
[self tableView:tableViewList didSelectRowAtIndexPath:selectedCellIndexPath];
[tableViewList selectRowAtIndexPath:selectedCellIndexPath animated:YES scrollPosition:UITableViewScrollPositionNone];

OR

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (/* should be selected */) {
        [cell setSelected:YES animated:NO];
    }
}

La version Swift 4 est

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    func shouldSelect() -> Bool {
        // Some checks
    }
    if shouldSelect() {
            tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
    }
}
55
Ravindhiran

Pour que la cellule apparaisse sélectionnée, vous devez appeler -setSelected:animated: de l'Intérieur -tableView:willDisplayCell:forRowAtIndexPath: ainsi:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (/* should be selected */) {
        [cell setSelected:YES animated:NO];
    }
}

Appeler -setSelected de n'importe où ailleurs n'a aucun effet.

81
Drew C

Swift 4: Sélection de la cellule initialement

import UIKit

class MyViewController: UIViewController, UITableViewDelegate {
    @IBOutlet weak var tableView: UITableView!
    ...

     func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

        if /* your code here */ == indexPath.row {
            tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableView.ScrollPosition.none)
        }
    }

    ...
}
40
Peter Kreinz

Je ne sais pas que vous attendez cette réponse. Par défaut, si vous souhaitez sélectionner la première ligne de votre tableView sans sélection manuelle, lancez simplement la méthode didSelectRowAtIndexPath comme ceci

- (void)viewDidAppear:(BOOL)animated {
    NSIndexPath *indexPath=[NSIndexPath indexPathForRow:0 inSection:0];
    [myTableView selectRowAtIndexPath:indexPath animated:YES  scrollPosition:UITableViewScrollPositionBottom];
}
10
wesley

Cela aidera également dans le cas de la navigation POP

fichier .h,

NSIndexPath *defaultSelectedCell

Fichier .m

Mettez ce code dans ViewDidLoad

defaultSelectedCell= [NSIndexPath indexPathForRow:0 inSection:0];

dans viewDidAppear

[self.tableView selectRowAtIndexPath:defaultSelectedCell animated:NO  scrollPosition:UITableViewScrollPositionNone];

Cela vous aidera lorsque vous POP, mettez ce code dans viewWillAppear

[self.catTableView selectRowAtIndexPath:defaultSelectedCell animated:NO scrollPosition:UITableViewScrollPositionNone];

dans tableView didSelectRowAtIndexPath Méthode,

defaultSelectedCell = [NSIndexPath indexPathForRow:indexPath.row inSection:0];

Cela m'aide parfaitement soit lors du premier chargement, soit dans Pop Navigation.

5
Ashu

Swift 4 et 5: Sélection initiale des cellules une seule fois sans willDisplayCell réinitialisation de leur état:

override func viewWillAppear(_ animated: Bool) {
    for section in 0..<tableView.numberOfSections {
        for row in 0..<tableView.numberOfRows(inSection: section) {
            let indexPath = IndexPath(row: row, section: section)

            if /* your condition for selecting here */ {
                _ = tableView.delegate?.tableView?(tableView, willSelectRowAt: indexPath) // remove if you don't want to inform the delegate
                tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
                tableView.delegate?.tableView?(tableView, didSelectRowAt: indexPath) // remove if you don't want to inform the delegate
            }
        }
    }
}
2
Jonathan Cabrera

Meilleure option

Swift 5

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if shouldSelectThisRow {
        tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
    } else {
        tableView.deselectRow(at: indexPath, animated: false)
    }
}
0
Lal Krishna

Swift 5, Merci beaucoup à la réponse de Ravindhiran:

let selectedCellIndexPath = IndexPath(row: 0, section: 0)
tableView(tableViewList, didSelectRowAt: selectedCellIndexPath)
tableViewList.selectRow(at: selectedCellIndexPath, animated: false, scrollPosition: .none)

ou

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if /* should be selected */{
          cell.setSelected(true, animated: false)
     }
}
0
dengST30
 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        // reset cell state
        cell.accessoryType = .none  // (if you needed)
        tableView.deselectRow(at: indexPath, animated: false)

        // if need select
        cell.accessoryType = .checkmark // (if you needed)
        tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
    }

// method work fine when tap cell 
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath)

use [cell setSelected: YES animated: NO]; robinet de cellule didSelectRowAt, didDeselectRowAt ne fonctionne pas

0
yuelong qin