これは実際には UIPageViewController のバグです。スクロール スタイル (UIPageViewControllerTransitionStyleScroll) でのみsetViewControllers:direction:animated:completion:
、animated:YESで呼び出した後にのみ発生します。したがって、次の 2 つの回避策があります。
UIPageViewControllerTransitionStyleScroll を使用しないでください。
または、 を呼び出す場合はsetViewControllers:direction:animated:completion:
、 のみを使用しますanimated:NO
。
バグを明確に確認するには、呼び出しsetViewControllers:direction:animated:completion:
てから、インターフェイスで (ユーザーとして)、前のページに手動で左 (戻る) に移動します。間違ったページに戻ることになります: 前のページではなく、setViewControllers:direction:animated:completion:
呼び出されたときにいたページです。
バグの理由は、スクロール スタイルを使用する場合、UIPageViewController が何らかの内部キャッシュを行うためと思われます。したがって、 の呼び出し後、setViewControllers:direction:animated:completion:
内部キャッシュのクリアに失敗します。前のページが何であるかを知っていると思います。したがって、ユーザーが前のページに左方向に移動すると、UIPageViewControllerは dataSource メソッドの呼び出しに失敗するpageViewController:viewControllerBeforeViewController:
か、間違った現在のビュー コントローラーで呼び出します。
バグを確認する方法を明確に示すムービーを投稿しました。
http://www.apeth.com/PageViewControllerBug.mov
EDITこのバグはおそらくiOS 8で修正されるでしょう。
編集このバグの別の興味深い回避策については、次の回答を参照してください: https://stackoverflow.com/a/21624169/341994