これは古い質問であり、私の答えはトムを悩ませている問題に直接対処することさえできないかもしれませんが、おそらく情報は誰かを助けるでしょう. UIPageViewController は、何日も私を悩ませました。私の間違いは、ページがめくられたときにのみこれらのメソッドが呼び出されると想定していたことです。
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
実際には、ページめくり中に複数回呼び出されるようです。currentPage
これらの2つのメソッドが呼び出されるたびにインクリメント/デクリメントするマスタービューコントローラーに変数がありましたが、トムが説明したのと同様の奇妙な動作を作成しました。私はまだこれらの方法を使用していますが(必要です)、別の方法でインクリメント/デクリメントを行います。これらのメソッドは次のようになります。
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
if (self.currentPage==0) {
return nil;
}
else {
return [[self pageArray] objectAtIndex:self.currentPage-1];
}
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
if (self.currentPage==self.pageArray.count-1)
{
return nil;
}
else
{
return [[self pageArray] objectAtIndex:self.currentPage+1];
}
}
のインクリメント/デクリメントは、次のcurrentPage
メソッドで発生します。
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
if (completed)
{
int currentIndex = ((UIViewController *)[self.pageViewController.viewControllers objectAtIndex:0]).view.tag;
self.currentPage = currentIndex;
}
}
この方法を使用するには、両方のプロトコルを追加する必要があります
<UIPageViewControllerDataSource, UIPageViewControllerDelegate>
データソースだけでなく、デリゲートを自分自身に設定します
self.pageViewController.delegate=self;
そうしないと、メソッドは呼び出されません。ビュー タグを使用して各ページのインデックスを決定していますが、この番号を取得する方法は他にもあります。現在のページのインデックスを取得する方法については、次の記事を参照してください。
UIPageViewController: 現在表示されているビューを返します
Web で見つけた UIPageViewController チュートリアルはすべて、ページごとに再利用される単一のビューコントローラーの使用を示していましたが、ページごとに個別のビューコントローラーがあるため、役に立ちませんでした。