webentwicklung-frage-antwort-db.com.de

Erinnern an die Bildlaufposition in UITableView

Ich habe ein Problem mit meiner iOS-App in xcode. Ich habe eine UITableView, die einige hundert Zellen lädt. Wenn ich zu einer bestimmten Zelle scrolle und zu detailviewcontrollers zurückspringe und wieder zurückkehre, ist die Master-View-Tabelle ganz nach oben zurückgekehrt. Ich habe mir die folgenden zwei ähnlichen Fragen angesehen.

Wie kann ich die UITableView-Bildlaufposition erhalten, um sie zu speichern?

Einstellen der Bildlaufposition in UITableView

Ich kann das immer noch nicht zum Laufen bringen. Ich bin nicht der erfahrenste Programmierer, daher habe ich wirklich Probleme damit.

Ich weiß, dass Dinge wie viewWillDisappear und viewDidAppear geändert werden müssen, aber ich kann einfach nicht viel weiter kommen.

In dieser Tabelle habe ich eine reloadData-Funktion, so dass es möglich ist, die neuesten Daten vom Server und eine funktionierende Suchleiste abzurufen.

Auf jeden Fall wäre eine helfende Hand großartig. Vielen Dank,

Luke

29
mylogon

Sortiert

Mit etwas Inspiration von Desdenova habe ich während der Arbeit gut darüber nachgedacht und begriffen, was es sein könnte. In Erinnerung, dass ich eine Suchleiste hatte, hatte ich vor einigen Monaten den folgenden Code implementiert, um ihn auszublenden:

[self.tableView setContentOffset:CGPointMake(0,-20) animated:NO];

In Naivität setze ich das in viewDidAppear statt in viewDidLoad. Offensichtlich verdeckte dies die Suchleiste nicht, aber da es sich im falschen Void-Befehl befand, tat es dies jedes Mal, wenn masterDetailView an die Spitze des Stapels kam. Nach dem Verschieben des obigen Codes in viewDidLoad verbirgt er ihn jetzt immer noch, aber nur einmal.

Ich schreibe es einfach so für andere Anfänger, wie ich selbst, die möglicherweise auf das gleiche Problem stoßen und nur ihren Verstand retten können!

Ich danke Ihnen allen für Ihre Ideen, die mir geholfen haben.

+1 an euch alle!

11
mylogon

Hier sehen Sie, dass Sie zuerst die gescrollte Position von tableView speichern müssen, d. H. contentOffset von tableView, und diese dann erneut verwenden, wenn Sie zu tableView zurückkehren.

1) Wann und wo werden Sie es speichern:

Wann : Wenn Sie zu detailViewController wechseln, speichern Sie die contentOffset von tableView.

Wie : float verticalContentOffset = tableView.contentOffset.y;

2) Wie setzen Sie tableView wieder auf die gleiche gescrollte Position:

[tableView setContentOffset:CGPointMake(0, verticalContentOffset)];

Hoffe, das wird dir helfen.

66
Prashant Nikam

Wenn sich jemand wundert, habe ich die Lösung von Prashant N ausprobiert und es hat funktioniert. reloadData setzt die Bildlaufposition jetzt jedoch nicht mehr zurück, daher musste ich nichts anderes als reloadData tun.

1
Enrico Susatyo

Aus irgendeinem Grund arbeitete das für mich nur halbwegs (manchmal wäre die Position nur ungefähr). Ich habe schließlich die folgende a priori weniger saubere Lösung verwendet

NSIndexPath *firstVisibleIndexPath = [[self.tableView indexPathsForVisibleRows] objectAtIndex:0];
[self.tableView scrollToRowAtIndexPath:self.firstVisibleIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
self.firstVisibleIndexPath = firstVisibleIndexPath;

das hat besser funktioniert.

1
vib

Meine Entscheidung für eine Sammlung:

CGFloat oldCollectionViewHeight = self.messageCollectionView.contentSize.height;

[self.messageCollectionView reloadData];
[self.messageCollectionView layoutIfNeeded];

CGFloat newCollectionViewHeight = self.messageCollectionView.contentSize.height;

if (oldCollectionViewHeight) {
    self.messageCollectionView.contentOffset = CGPointMake(0, newCollectionViewHeight - oldCollectionViewHeight);
}

Für die Tabelle ist das Prinzip dasselbe.

1
Dmitry Malysh

Meine Lösung für dieses Problem bestand darin, die Tabelle zur Indexzeile des letzten Elements zu scrollen.

private func scrollToItem(item:Int, section:Int bottom:Bool = true, animated:Bool = false) {
    let indexPath = NSIndexPath(forRow: item:Int-1, inSection: section)
    var position = UITableViewScrollPosition.Bottom
    if (!bottom) { position = UITableViewScrollPosition.Top }
    self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: position, animated: animated)
}
1

Wie in anderen Kommentaren erwähnt, ist das Blättern nach oben in der Rückwärtsnavigation in einem UINavigationController nicht das Standardverhalten.

Eine andere Ursache könnte darin bestehen, dass Sie in viewWillAppear eine Zelle in der Nähe des oberen Bereichs der Tabelle festlegen, z. ein Suchfeld oder ein Bearbeitungsfeld am oberen Rand Ihrer Tabelle. UITableViewController rollt einen ersten Responder automatisch in das Bild ein. Dies ist Nizza. Solange Sie dies versuchen. :) Achten Sie darauf, den ersten Responder in viewWillAppear nicht festzulegen, es sei denn, Sie möchten dies. Cheers, AZ

0
andyzei

Sie müssen nichts tun, wenn Sie sich in derselben Ansichtssteuerung befinden, ist Ihre Position dieselbe. Ich befürchte, dass irgendwo in Ihrem View Controller reloadData genannt wird. Suchen Sie nach einer Methode, die scrollToRowAtIndexPath aufruft. 

0
aph340