web-dev-qa-db-ja.com

UIPageViewControllerを更新-ページを並べ替えて新しいページを追加

UIPageViewControllerUIPageControllerDelegateの実装を使用するためのページデータを提供しているUIPageControllerDataSourceがあります。

すべて正常に機能していますが、ページデータにアイテムを追加し、ページデータの順序を変更できるようにしたいと考えています。

ユーザーが既に最後のページに到達してからアイテムを追加すると、viewControllerAfterViewController:が既に呼び出されているため、次のページに到達できません。 1つ前にスクロールしてから2つ前にスクロールすると、新しいページに正常に到達できるため、データが正しくセットアップされます。 UIPageViewControllerに次に来るもののストアを更新するように指示するにはどうすればよいですか?

同様に、ページビューをサポートしているコレクションを並べ替えたいと思います。しかし、これを行うと同じ問題が発生します。ページビューでは、現在のページが最後に読み込まれたときの次のページがまだ残っていると見なされます。

UITableViewreloadData:に似たものを探していると思います。

36
ssloan

setViewControllers:direction:animated:completion:を呼び出す必要があります。

また、iOS 6では、animated:がYESの場合に大きなキャッシュバグがあるため、UIPageViewControllerTransitionStyleScrollスタイルを使用しているかどうかに注意してください(ここでの議論を参照してください: UIPageViewControllerは間違った場所に移動しますスクロール遷移スタイルのページ )。

29
matt

現在表示されていない隣接ページのキャッシュされたView Controllerを忘れる_UIPageViewControllerを強制する回避策を見つけました:

pageViewController.dataSource = nil;
pageViewController.dataSource = self;

これは、ページのセットを変更するたびに行います。もちろん、これは現在表示されているページには影響しません。

この回避策を使用すると、キャッシュのバグを回避し、animated:YES in setViewControllers:direction:animated:completion:

88
Ortwin Gentz

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
    }
}
3
theory

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
    }
}
0
Parion