簡體   English   中英

記住UITableView上的滾動位置

[英]Remembering scroll position on UITableView

我在xcode中的iOS應用存在問題。 我有一個UITableView可以加載數百個單元格。 當我向下滾動到一個特定的單元格並向下鑽取到詳細的viewcontrollers並再次返回時,主視圖表一直返回到頂部。 我看了以下兩個相似的問題。

如何獲取UITableView滾動位置以便保存它?

在UITableView中設置滾動位置

我仍然無法使它們正常工作。 我不是最有經驗的編碼員,所以我為此感到非常掙扎。

我知道需要更改諸如viewWillDisappear和viewDidAppear之類的東西,但是我實在不能做得更多。

在此表上,我具有reloadData功能,因此可以從服務器中提取最新數據,還可以在工作中搜索欄。

無論如何,伸出援助之手會很棒。 謝謝,

路加

看到這里,你必須先保存的滾動位置tableViewcontentOffsettableView然后再用它,當你回來tableView

1)何時何地保存它:

什么時候 :在這一點上,當您向下鑽取到detailViewController保存tableViewcontentOffset

如何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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM