48

私の UIPageViewController は iOS 5 で正常に動作していました。しかし、iOS 6 が登場したとき、ページ カール スタイルの代わりに新しいスクロール トランジション スタイル (UIPageViewControllerTransitionStyleScroll) を使用したいと考えました。これにより、UIPageViewController が壊れました。

を呼び出した直後を除いて、正常に動作しますsetViewControllers:direction:animated:completion:。その後、次にユーザーが手動で 1 ページ分スクロールすると、間違ったページが表示されます。ここで何が問題なのですか?

4

8 に答える 8

81

このバグの私の回避策は、終了時に同じビューコントローラーを設定するがアニメーションなしのブロックを作成することでした

__weak YourSelfClass *blocksafeSelf = self;     
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:^(BOOL finished){
            if(finished)
            {
                dispatch_async(dispatch_get_main_queue(), ^{
                    [blocksafeSelf.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL];// bug fix for uipageview controller
                });
            }
        }];
于 2012-11-06T15:11:30.257 に答える
62

これは実際には UIPageViewController のバグです。スクロール スタイル (UIPageViewControllerTransitionStyleScroll) でのみsetViewControllers:direction:animated:completion: 、animated:YESで呼び出した後にのみ発生します。したがって、次の 2 つの回避策があります。

  1. UIPageViewControllerTransitionStyleScroll を使用しないでください。

  2. または、 を呼び出す場合は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

于 2012-10-17T16:54:15.887 に答える
3

これが私がまとめた「大まかな」要点です。これには、アルツハイマー病に苦しむ UIPageViewController の代替が含まれています (つまり、Apple 実装の内部キャッシュがありません)。

このクラスは完全ではありませんが、私の状況では機能します (つまり、水平スクロール)。

于 2013-05-15T08:16:21.230 に答える
0

このバグは iOS9 にも存在します。私は、George Tsifrikas が上に投稿したのと同じ回避策を使用していますが、Swift バージョンを使用しています。

    pageViewController.setViewControllers([page], direction: direction, animated: true) { done in
        if done {
            dispatch_async(dispatch_get_main_queue()) {
                self.pageViewController.setViewControllers([page], direction: direction, animated: false, completion: {done in })
            }
        }
    }
于 2016-05-12T21:28:33.647 に答える