XcodeのiOSアプリに少し問題があります。数百のセルをロードするUITableViewがあります。特定のセルまでスクロールダウンし、detailedviewcontrollersにドリルダウンして再び戻ると、マスタービューテーブルが一番上に戻りました。同様の2つの質問を見てきました。
保存できるようにUITableViewスクロール位置を取得するにはどうすればよいですか?
私はまだこれらを機能させることができません。私は経験豊富なコーダーではないので、これに本当に苦労しています。
ViewWillDisappearやviewDidAppearのようなものを変更する必要があることは知っていますが、それ以上のことはできません。
このテーブルにはreloadData機能があるため、サーバーから最新のデータを取得したり、検索バーを使用したりできます。
とにかく、救いの手は素晴らしいでしょう。ありがとう、
ルカ
ソート済み!
Desdenovaから少しインスピレーションを得て、仕事中に私はそれについてよく考え、何ができるかを実感しました。検索バーがあることを思い出して、数か月前に次のコードを実装して非表示にしました。
[self.tableView setContentOffset:CGPointMake(0,-20) animated:NO];
単純に、viewDidAppear
ではなくviewDidLoad
に入れました。明らかに、これは検索バーを非表示にしましたが、間違ったvoidコマンドになっていると、masterDetailViewがスタックの最上部に戻るたびにそれを実行しました。したがって、上記のコードをviewDidLoadに移動した後も、非表示になりますが、一度だけです。
私は、同じ問題に出くわし、正気を保つかもしれない、私のような他の初心者のために、このように綴っているだけです!
助けてくれたあなたのアイデアに感謝します。
あなたのすべてに+1!
ここを参照して、最初にtableView
のスクロール位置、つまりcontentOffset
のtableView
を保存し、tableView
に戻ったときに再使用する必要があります。
1)いつ、どこに保存するか:
When:detailViewController
にドリルダウンする時点で、contentOffset
のtableView
を保存します
方法:float verticalContentOffset = tableView.contentOffset.y;
2)tableViewを同じスクロール位置に戻す方法:
[tableView setContentOffset:CGPointMake(0, verticalContentOffset)];
これがあなたを助けることを願っています。
誰かが疑問に思っているなら、私はPrashant Nによる解決策を試してみましたが、うまくいきました。ただし、reloadData
は実際にはスクロール位置をリセットしないため、reloadData
以外の操作は必要ありませんでした。
何らかの理由で、これは私にとって中途半端な作業でした(場合によっては、位置が近似値に過ぎないこともあります)。私は最終的に次のものを先験的にあまりクリーンでないソリューションを使用しました
NSIndexPath *firstVisibleIndexPath = [[self.tableView indexPathsForVisibleRows] objectAtIndex:0];
[self.tableView scrollToRowAtIndexPath:self.firstVisibleIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
self.firstVisibleIndexPath = firstVisibleIndexPath;
うまくいきました。
この問題に対する私の解決策は、最後のアイテムのインデックス行までテーブルをスクロールすることでした。
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)
}
他のコメントで述べたように、UINavigationControllerの戻るナビゲーションの一番上へのスクロールはデフォルトの動作ではありません。
別の原因としては、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);
}
表については、原則は同じです。
あなたは何もする必要はありません。同じView Controllerにいる間、あなたの位置は同じになります。 View ControllerのどこかがreloadDataと呼ばれているのではないかと思います。 scrollToRowAtIndexPathを呼び出すメソッドを検索します。