Question

J'ai une application qui fonctionne de la même manière que l'application Contact de l'iPhone. Lorsque nous ajoutons un nouvel utilisateur, le contact est dirigé vers un écran contenant uniquement des informations de contact. Si nous sélectionnons " Tous les contacts " À partir de la barre de navigation, l'utilisateur accède à la liste de tous les contacts pour lesquels le dernier contact ajouté est visible.

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 juste après avoir appelé:

    [tableView reloadData];

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

Existe-t-il une méthode de délégation appelée après la méthode suivante?

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
Était-ce utile?

La solution

Je pense avoir 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 place reloadData dans viewWillAppear: animé: et scrollToRowAtIndexPath: ... dans viewDidAppear: animé: .

// 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 cela aide. Si vous ajoutez quelque chose au milieu de la liste, vous pouvez facilement faire défiler jusqu'à cette position.

Autres conseils

Vous pouvez essayer ceci, mon application dans une sorte de similaire à vous lorsque 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 vers le haut

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

Le défilement de l’animation est inévitable lorsque le décalage est défini à partir de viewDidAppear (_:) . viewWillAppear (_:) constitue un meilleur emplacement pour définir le décalage de défilement initial. Vous devrez forcer la présentation d'un 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)
    }
}

Avez-vous suffisamment de contacts factices ajoutés pour tester le défilement? Il semble que l’iPhone trouve l’entrée à faire défiler uniquement lorsque votre table de visualisation a une certaine taille.

Ceci est le code qui fonctionne pour moi dans mon projet. J'utilise un bouton précédent et, par conséquent, je fais défiler la vue tableau un peu plus bas, ce qui correspond généralement à UITABLEVIEWSCROLLPOSITION. (mon bouton précédent ne fonctionnera pas s'il ne peut pas "voir" la cellule précédente.

Ignorer 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];

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top