web-dev-qa-db-fra.com

Sélectionnez la première ligne par défaut dans UITableView

J'ai une application basée sur la vue et j'ajoute une vue de table comme sous-vue à la vue principale. J'ai pris UITableViewDelegate pour répondre aux méthodes de table. Tout fonctionne bien, mais je veux sélectionner la première ligne ou UITableView par défaut sélectionné (surligné).

S'il vous plaît, aidez-moi, avec quel code j'ai besoin et où je dois le mettre.

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

La meilleure façon d'utiliser cela dans votre code, si vous souhaitez sélectionner une ligne par défaut, utilisez dans viewDidAppear.

110
Zain Raza

Solution mise à jour Swit 3.

let indexPath = IndexPath(row: 0, section: 0)
tblView.selectRow(at: indexPath, animated: true, scrollPosition: .bottom)
10
Sourabh Sharma
- (void)viewWillAppear:(BOOL)animated
    {

       [super viewWillAppear:animated];

     // assuming you had the table view wired to IBOutlet myTableView

        // and that you wanted to select the first item in the first section

        [myTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:0];
    }
8
Ankit Vyas
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];

    if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad){
        NSIndexPath* indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionTop];
        [self tableView:self.tableView didSelectRowAtIndexPath:indexPath];
    }
}
5
malhal

Mise à jour Swift 4:

func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    let indexPath = IndexPath(row: 0, section: 0)
    myTableView.selectRow(at: indexPath, animated: true, scrollPosition: .bottom)
}

Modifiez les valeurs de ligne et de section si vous souhaitez sélectionner une autre ligne dans une section différente.

3
Sanket Ray

Voici comment procéder dans Swift 1.2:

override func viewWillAppear(animated: Bool) {
    let firstIndexPath = NSIndexPath(forRow: 0, inSection: 0)
    self.tableView.selectRowAtIndexPath(firstIndexPath, animated: true, scrollPosition: .Top)
}
3
Ture Flase

Voici ma solution pour Swift 3.0:

var selectedDefaultIndexPath = false


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

    if dataSource.isEmpty == false, selectedDefaultIndexPath == false {
        let indexPath = IndexPath(row: 0, section: 0)
        // if have not this, cell.backgroundView will nil.
        tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
        // trigger delegate to do something.
        _ = tableView.delegate?.tableView?(tableView, willSelectRowAt: indexPath)
        selectedDefaultIndexPath = true
    }
}

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    let cell = tableView.cellForRow(at: indexPath)
    cell?.selectedBackgroundView?.backgroundColor = UIColor(hexString: "#F0F0F0")

    return indexPath
}
1
jkyin

Pour sélectionner uniquement la première cellule la première fois que la table est chargée, on pourrait penser que l'utilisation de viewDidLoad est le bon endroit où aller, mais, à ce moment de l'exécution, la table n'a pas 'n'a pas chargé son contenu, donc cela ne fonctionnera pas (et plantera probablement l'application puisque NSIndexPath pointera vers une cellule inexistante).

Une solution de contournement consiste à utiliser une variable qui indique que la table a déjà été chargée et à effectuer le travail en conséquence.

@implementation MyClass {
    BOOL _tableHasBeenShownAtLeastOnce;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    _tableHasBeenShownAtLeastOnce = NO; // Only on first run
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if ( ! _tableHasBeenShownAtLeastOnce )
    {
        _tableHasBeenShownAtLeastOnce = YES;
        BOOL animationEnabledForInitialFirstRowSelect = YES; // Whether to animate the selection of the first row or not... in viewDidAppear:, it should be YES (to "smooth" it). If you use this same technique in viewWillAppear: then "YES" has no point, since the view hasn't appeared yet.
        NSIndexPath *indexPathForFirstRow = [NSIndexPath indexPathForRow:0 inSection: 0];

        [self.tableView selectRowAtIndexPath:indexPathForFirstRow animated:animationEnabledForInitialFirstRowSelect scrollPosition:UITableViewScrollPositionTop];
    }
}

/* More Objective-C... */

@end
1
Alejandro Iván

Nous utilisons des images d'arrière-plan personnalisées pour la cellule selon qu'il s'agit ou non de la première cellule ... une cellule du milieu ou la dernière cellule. De cette façon, nous obtenons un joli coin arrondi sur toute la table. Lorsque la ligne est sélectionnée, elle échange une belle cellule `` en surbrillance '' pour indiquer à l'utilisateur qu'il a sélectionné une cellule.

UIImage *rowBackground;
UIImage *selectionBackground;
NSInteger sectionRows = [tableView numberOfRowsInSection:[indexPath section]];
NSInteger row = [indexPath row];

if (row == 0 && row == sectionRows - 1)
{
    rowBackground = [UIImage imageNamed:@"topAndBottomRow.png"];
    selectionBackground = [UIImage imageNamed:@"topAndBottomRowSelected.png"];
}
else if (row == 0)
{
    rowBackground = [UIImage imageNamed:@"topRow.png"];
    selectionBackground = [UIImage imageNamed:@"topRowSelected.png"];
}
else if (row == sectionRows - 1)
{
    rowBackground = [UIImage imageNamed:@"bottomRow.png"];
    selectionBackground = [UIImage imageNamed:@"bottomRowSelected.png"];
}
else
{
    rowBackground = [UIImage imageNamed:@"middleRow.png"];
    selectionBackground = [UIImage imageNamed:@"middleRowSelected.png"];
}


((UIImageView *)cell.backgroundView).image = rowBackground;
((UIImageView *)cell.selectedBackgroundView).image = selectionBackground;

Si vous souhaitez simplement créer la première cellule, celle qui se trouve à indexPath.row == 0, pour utiliser un arrière-plan personnalisé.

Ceci est dérivé de Matt Gallagher excellent site

0
Michael Morrison