web-dev-qa-db-fra.com

Définition de la position de défilement dans UITableView

J'ai une application qui fonctionne comme la façon dont l'application Contact de l'iPhone fonctionne. Lorsque nous ajoutons un nouveau contact, l'utilisateur est dirigé vers un écran d'affichage uniquement avec les informations de contact. Si nous sélectionnons "Tous les contacts" dans la barre de navigation, l'utilisateur accède à la liste de tous les contacts où le contact récemment ajouté est en vue.

Nous pouvons déplacer la vue vers une ligne particulière en utilisant:

    [itemsTableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionBottom];

... mais ça ne marche pas. J'appelle ça juste après avoir appelé:

    [tableView reloadData];

Je pense que je ne suis pas censé appeler selectRowAtIndexPath:animated:scrollPosition méthode ici. Mais sinon ici, alors où?

Y a-t-il une méthode déléguée qui est appelée après la méthode suivante?

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
27
Mustafa

Je pense que j'ai une application similaire: une liste d'éléments., Appuyez sur '+' -> nouvel écran, revenez voir la liste mise à jour, faites défiler pour afficher l'élément ajouté en bas.

En résumé, je mets reloadData dans viewWillAppear:animated: et scrollToRowAtIndexPath:... dans viewDidAppear:animated:.

// Note: Member variables dataHasChanged and scrollToLast have been
// set to YES somewhere else, e.g. when tapping 'Save' in the new-item view.

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    if (dataHasChanged) {
        self.dataHasChanged = NO;
        [[self tableView] reloadData];
    } else {
        self.scrollToLast = NO; // No reload -> no need to scroll!
    }
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    if (scrollToLast) {
        NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:([dataController count] - 1) inSection:0];
        [[self tableView] scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
    }
}

J'espère que ça aide. Si vous ajoutez quelque chose au milieu de la liste, vous pouvez facilement faire défiler jusqu'à cette position.

61
squelart

Vous pouvez essayer ceci, mon application dans une sorte de semblable à vous quand je clique sur un bouton de défilement de uitableview est en place.

[tableviewname setContentOffset:CGPointMake(0, ([arrayofcontact count]-10)*cellheight) animated:YES];

10 correspond au nombre de cellules que vous souhaitez faire défiler

J'espère que cela vous aidera:-)

6
Birju

L'animation de défilement est inévitable lorsque le décalage est défini à partir de viewDidAppear(_:). Un meilleur endroit pour définir l'offset de défilement initial est viewWillAppear(_:). Vous devrez forcer la disposition d'une vue de tableau, car sa taille de contenu n'est pas définie à ce stade.

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

    tableView.setNeedsLayout()
    tableView.layoutIfNeeded()

    if let selectedIndexPath = selectedIndexPath, tableView.numberOfRows(inSection: selectedIndexPath.section) > 0 {
        tableView.scrollToRow(at: selectedIndexPath, at: .top, animated: false)
    }
}
1
Vadim Bulavin

Avez-vous suffisamment de contacts factices ajoutés pour tester le défilement? Il semble que ce n'est que lorsque votre tableView est d'une certaine taille que l'iPhone trouve l'entrée pour faire défiler.

C'est le code qui fonctionne pour moi dans mon projet. J'utilise un bouton précédent et je fais donc défiler la vue de la table un peu plus bas qu'elle irait généralement avec UITABLEVIEWSCROLLPOSITION. (mon bouton précédent ne fonctionnera pas s'il ne peut pas "voir" la cellule précédente.

Ignorez certains des appels de méthode personnalisés.

- (void)textFieldDidBeginEditing:(UITextField *)textField {

    //Show the navButtons
    [self navButtonAnimation];


    DetailsStandardCell *cell = (DetailsStandardCell *)textField.superview.superview.superview;

    self.parentController.lastCell = cell;


    //Code to scroll the tableview to the previous indexpath so the previous button will work. NOTE previous button only works if its target table cell is visible.
    NSUInteger row = cell.cellPath.row;
    NSUInteger section = cell.cellPath.section;

    NSIndexPath *previousIndexPath = nil;


    if (cell.cellPath.row == 0 && cell.cellPath.section != 0) //take selection back to last row of previous section
    {
    NSUInteger previousIndex[] = {section -1, ([[self.sections objectForKey:[NSNumber numberWithInt:section - 1]]count] -1)};
    previousIndexPath = [[NSIndexPath alloc] initWithIndexes:previousIndex length:2];   
    }
    else if (cell.cellPath.row != 0 && cell.cellPath.section != 0)
    {
        NSUInteger previousIndex[] = {section, row - 1};
        previousIndexPath = [[NSIndexPath alloc] initWithIndexes:previousIndex length:2];       

    }


    [self.theTableView scrollToRowAtIndexPath: cell.cellPath.section == 0 ? cell.cellPath : previousIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

}
0
Dan Morgan