42

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

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

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

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

私はに似たものを探していると思いreloadData:ますUITableView

4

4 に答える 4

94

UIPageViewController現在表示されていない隣接ページのキャッシュされたViewControllerを忘れるように強制する回避策を見つけました。

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

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

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

于 2014-02-07T09:42:18.160 に答える
31

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

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

于 2013-03-10T18:31:23.413 に答える
4

これが、Swift2の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
    }
}
于 2016-08-04T20:57:10.967 に答える
1

pageviewcontrollerのデータを@theoryのバージョンにリロードするためのSwift4バージョン。

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
    if !completed { return }
    DispatchQueue.main.async() {
        self.dataSource = nil
        self.dataSource = self
    }
}
于 2018-06-06T06:04:54.670 に答える