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.
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)
}
}
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.
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)
}
}
...
}
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];
}
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.
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
}
}
}
}
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)
}
}
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)
}
}
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