UIPageViewController
とUIPageControllerDelegate
の実装を使用するためのページデータを提供しているUIPageControllerDataSource
があります。
すべて正常に機能していますが、ページデータにアイテムを追加し、ページデータの順序を変更できるようにしたいと考えています。
ユーザーが既に最後のページに到達してからアイテムを追加すると、viewControllerAfterViewController:
が既に呼び出されているため、次のページに到達できません。 1つ前にスクロールしてから2つ前にスクロールすると、新しいページに正常に到達できるため、データが正しくセットアップされます。 UIPageViewController
に次に来るもののストアを更新するように指示するにはどうすればよいですか?
同様に、ページビューをサポートしているコレクションを並べ替えたいと思います。しかし、これを行うと同じ問題が発生します。ページビューでは、現在のページが最後に読み込まれたときの次のページがまだ残っていると見なされます。
UITableView
でreloadData:
に似たものを探していると思います。
setViewControllers:direction:animated:completion:
を呼び出す必要があります。
また、iOS 6では、animated:
がYESの場合に大きなキャッシュバグがあるため、UIPageViewControllerTransitionStyleScrollスタイルを使用しているかどうかに注意してください(ここでの議論を参照してください: UIPageViewControllerは間違った場所に移動しますスクロール遷移スタイルのページ )。
現在表示されていない隣接ページのキャッシュされたView Controllerを忘れる_UIPageViewController
を強制する回避策を見つけました:
pageViewController.dataSource = nil;
pageViewController.dataSource = self;
これは、ページのセットを変更するたびに行います。もちろん、これは現在表示されているページには影響しません。
この回避策を使用すると、キャッシュのバグを回避し、animated:YES
in setViewControllers:direction:animated:completion:
。
Swift 2のdidFinishデリゲートメソッドでの@ ortwin-gentzの答えの完全な実装を次に示します。
func pageViewController(
pageViewController: UIPageViewController,
didFinishAnimating finished: Bool,
previousViewControllers: [UIViewController],
transitionCompleted completed: Bool
) {
if !completed { return }
dispatch_async(dispatch_get_main_queue()) {
pageViewController.dataSource = nil
pageViewController.dataSource = self
}
}
Pageviewcontrollerのデータを@theoryのバージョンにリロードするためのSwift 4バージョン。
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
if !completed { return }
DispatchQueue.main.async() {
self.dataSource = nil
self.dataSource = self
}
}