Domanda

Ho un'applicazione che funziona in modo simile a come funziona l'applicazione Contatti di iPhone. Quando aggiungiamo un nuovo contatto, l'utente viene indirizzato a una schermata di sola visualizzazione con le informazioni di contatto. Se selezioniamo " Tutti i contatti " dalla barra di navigazione, l'utente viene navigato nell'elenco di tutti i contatti in cui è visualizzato il contatto aggiunto di recente.

Possiamo spostare la vista su una riga particolare usando:

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

... ma non funziona. Lo chiamo subito dopo aver chiamato:

    [tableView reloadData];

Penso che non suppongo di chiamare il metodo selectRowAtIndexPath: animato: scrollPosition qui. Ma se non qui, allora dove?

Esiste un metodo delegato che viene chiamato dopo il seguente metodo?

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
È stato utile?

Soluzione

Penso di avere un'app simile: un elenco di elementi., tocca "+" - > nuova schermata, torna indietro e visualizza l'elenco aggiornato, fatto scorrere per mostrare l'elemento aggiunto in basso.

In breve, ho messo reloadData in viewWillAppear: animato: e scrollToRowAtIndexPath: ... in viewDidAppear: animato: .

// 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];
    }
}

Spero che questo aiuti. Se aggiungi qualcosa in mezzo all'elenco, puoi facilmente scorrere fino a quella posizione.

Altri suggerimenti

Puoi provare questo, la mia applicazione è in qualche modo simile a te quando faccio clic su un pulsante lo scorrimento di uitableview è attivo.

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

10 è per quante celle vuoi scorrere verso l'alto

Spero che questo ti possa aiutare :-)

L'animazione a scorrimento è inevitabile quando l'offset è impostato da viewDidAppear (_ :) . Un posto migliore per l'impostazione dell'offset di scorrimento iniziale è viewWillAppear (_ :) . Dovrai forzare il layout di una vista tabella, poiché la sua dimensione del contenuto non è definita in quel punto.

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)
    }
}

Hai abbastanza contatti fittizi aggiunti per testare lo scorrimento? Sembra che solo quando tableView abbia una certa dimensione, l'iPhone trova l'input da scorrere.

Questo è il codice che funziona per me nel mio progetto. Uso un pulsante precedente e quindi scorro la tabella un po 'più in basso che di solito andrebbe con UITABLEVIEWSCROLLPOSITION. (il mio pulsante precedente non funzionerà se non è in grado di " vedere " la cella precedente.

Ignora alcune chiamate al metodo personalizzato.

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

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top