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