2013-03-09 14 views
5

私はUIPageViewControllerを持っています。これには、ネットワーク経由で取り込まれたデータからインスタンス化されたビューコントローラが含まれています。ユーザーがページングして、最後の数ページになると、私は新しいネットワーク操作を開始し、新しいビューコントローラをUIPageViewControllerDataSourceのビューコントローラの変更可能な配列の最後に配置します。一般に、これはすべてうまくいきます。ユーザーが最後のページに到達した後、新しいページをUIPageViewControllerに追加するにはどうすればよいですか?

しかし、ネットワークが低速(またはユーザーが高速)の場合、ネットワーク操作が完了する前に最終ページに到達することができます。ユーザが最後のページに到達したときにpageViewController:viewControllerAfterViewController:が呼び出されるため、すでにnil(「次のビューコントローラがないことを示すために」)が返されています。

UIPageViewControllerにもう一度pageViewController:viewControllerAfterViewController:を呼び出す良い方法はありますか(ネットワーク操作が完了し、新しいページがあるときに、この呼び出しを強制してユーザーが新しいページを表示できるようにする)か?または回避策があります(おそらくユーザーが最後のページにページングするのを防ぐが、バウンスアニメーションを表示しています)。

+0

私は同じ問題を抱えています。道を見つけたらここにあなたのソリューションを投稿してください。私も同じことをやります。 Thanks – ssloan

答えて

1

ssloanの答えは私の場合、ネットワーク操作完了ブロックのsetViewControllers:direction:animated:completion:を呼び出すだけでは不十分です(いくつかのエッジケースのため)。

私のソリューションは、私はいつでも私のNSMutableArrayのと呼ばれ... pageViewController:viewControllerAfterViewController:nilを返される最新のビューコントローラを保存するために(私はendPageそれを呼ばれる)とメソッドを作成するために...

- (void)fixAndResetEndPage { 
    if (self.endPage && self.endPage == self.currentPage) { 
     [self.pageController setViewControllers:@[self.currentPage] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 
     self.endPage = nil; 
    } 
} 

ましたコンテンツコントローラは、完了するたびにpageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:に変更されました(ネットワーク操作の完了など)。YESでした。

+0

私の経験上、setViewControllers()を呼び出すと、そのpageViewController:viewControllerAfterViewControllerが呼び出されることは保証されません。 – Lombas

5

はここを参照してください:あなたが戻ってネットワークからデータを取得するとRefresh UIPageViewController - reorder pages and add new pages

setViewControllers: direction: animated: completion:を呼び出し、再び現在のものに現在のビューを設定します。それは再呼び出しするように強制しますpageViewController:viewControllerAfterViewController:

+0

現在のView Controllerを強制的にリロードします。現在のページを再読み込みせずに修正できますか? – neobie

関連する問題