[英]Remembering scroll position on UITableView
我在xcode中的iOS應用存在問題。 我有一個UITableView可以加載數百個單元格。 當我向下滾動到一個特定的單元格並向下鑽取到詳細的viewcontrollers並再次返回時,主視圖表一直返回到頂部。 我看了以下兩個相似的問題。
我仍然無法使它們正常工作。 我不是最有經驗的編碼員,所以我為此感到非常掙扎。
我知道需要更改諸如viewWillDisappear和viewDidAppear之類的東西,但是我實在不能做得更多。
在此表上,我具有reloadData功能,因此可以從服務器中提取最新數據,還可以在工作中搜索欄。
無論如何,伸出援助之手會很棒。 謝謝,
路加
看到這里,你必須先保存的滾動位置tableView
即contentOffset
的tableView
然后再用它,當你回來tableView
。
1)何時何地保存它:
什么時候 :在這一點上,當您向下鑽取到detailViewController
保存tableView
的contentOffset
如何 : float verticalContentOffset = tableView.contentOffset.y;
2)如何將tableView設置回相同的滾動位置:
[tableView setContentOffset:CGPointMake(0, verticalContentOffset)];
希望這會幫助你。
排序!
在工作中,我從Desdenova身上獲得了一些啟發,對此我進行了認真的思考,並意識到了它的可能。 記住我有一個搜索欄,幾個月前我實現了以下代碼以將其隱藏:
[self.tableView setContentOffset:CGPointMake(0,-20) animated:NO];
出於天真,我將其放在viewDidAppear
而不是viewDidLoad
。 顯然,這確實隱藏了搜索欄,但是由於它位於錯誤的void命令中,因此每次masterDetailView返回堆棧頂部時,它都會進行搜索。 因此,將上面的代碼移動到viewDidLoad之后,它現在仍然將其隱藏,但僅一次。
我只是為其他初學者(像我自己)這樣拼寫出來,他們可能會遇到相同的問題並且可能會保存理智!
謝謝大家為我提供幫助的想法。
對所有人+1!
如果有人想知道,我嘗試了Prashant N的解決方案,它奏效了。 但是reloadData
現在實際上不再重置滾動位置了,因此除了reloadData
之外,我無需執行其他任何操作。
我對這個問題的解決方案包括將表滾動到最后一項的索引行。
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)
}
由於某種原因,這對我來說是半途而廢的(有時職位只是大概的)。 我終於使用了以下優先級較低的解決方案
NSIndexPath *firstVisibleIndexPath = [[self.tableView indexPathsForVisibleRows] objectAtIndex:0];
[self.tableView scrollToRowAtIndexPath:self.firstVisibleIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
self.firstVisibleIndexPath = firstVisibleIndexPath;
效果更好。
如其他注釋中所述,滾動到UINavigationController中的Back導航頂部不是默認行為。
另一個原因可能是您正在將表格頂部附近的單元格設置為viewWillAppear中的第一響應者,例如,表格頂部附近的搜索框或編輯字段。 UITableViewController會自動將第一個響應者滾動到視圖中,這很好。 只要這就是您要嘗試的方法。 :)注意不要在viewWillAppear中設置第一響應者,除非您要這樣做。 亞利桑那州,干杯
我的收藏決定:
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);
}
對於表,原理是相同的。
您無需執行任何操作,當您在同一視圖控制器中時,您的位置將相同。 恐怕您的視圖控制器中的某處被稱為reloadData。 搜索一些調用scrollToRowAtIndexPath的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.