Frage

Ich habe eine Anwendung, die einige, was ähnlich wie bei iPhone Kontakt Anwendung funktioniert funktioniert. Wenn wir einen neuen Kontakt Benutzer in den Blick gerichtet ist Bildschirm nur mit Kontaktinformationen. Wenn wir „Alle Kontakte“ in der Navigationsleiste auswählen, wird Benutzer Liste aller Kontakte navigiert, wo der zuletzt hinzugefügten Kontakt in Sicht ist.

Wir können die Ansicht auf eine bestimmte Zeile bewegen Sie mit:

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

... aber es funktioniert nicht. Ich rufe dieses Recht nach dem Aufruf:

    [tableView reloadData];

Ich glaube, ich nehme an Verfahren nicht nennen selectRowAtIndexPath:animated:scrollPosition hier. Aber wenn nicht hier, wo dann?

Gibt es eine delegierte Methode, die nach der folgenden Methode aufgerufen wird?

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
War es hilfreich?

Lösung

Ich glaube, ich habe eine ähnliche App bekam: Eine Liste von Element, tippen ‚+‘ -> neuer Bildschirm, kommen zurück und sehen Sie die aktualisierte Liste gescrollt am unteren Rand den zusätzlichen Punkt zeigen

..

Insgesamt Ich habe reloadData in viewWillAppear:animated: und scrollToRowAtIndexPath:... in 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];
    }
}

Ich hoffe, das hilft. Wenn Sie etwas in der Mitte der Liste hinzuzufügen, könnte man leicht stattdessen zu dieser Position bewegen.

Andere Tipps

Sie können versuchen, diese, meine Anwendung in einer Art ähnlich wie Sie, wenn ich auf eine Schaltfläche Scroll UITableView klicken up wird.

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

10 ist, für wie viele Zelle, die Sie bewegen möchten

Hope dies wird Ihnen helfen: -)

Scrolling Animation ist unvermeidlich, wenn sie von viewDidAppear(_:) gesetzt versetzt ist. Ein besserer Ort für die Einstellung Anfangs Scroll-Offset ist viewWillAppear(_:). Sie werden das Layout einer Tabellenansicht zwingen müssen, weil sie Inhalte Größe ist nicht an diesem Punkt definiert ist.

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

Haben Sie genug Dummy-Kontakte hinzugefügt, um das Scrollen zu testen? Es scheint, dass nur dann, wenn Ihre Tableview mit einer bestimmten Größe ist das iPhone den inputus findet blättern.

Dies ist der Code, der für mich in meinem Projekt arbeitet. Ich benutze eine vorherige Taste und damit blättere ich die Tableview ein wenig weiter nach unten, dass es in der Regel mit UITABLEVIEWSCROLLPOSITION gehen würde. (Meine vorherige Taste funktioniert nicht, wenn es nicht „sehen“ die vorherige Zelle.

einige der benutzerdefinierte Methode Anrufe ignorieren.

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

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top