1

このスレッドに従って、UIPageViewController のカウンターを取得しました。

最初または最後のページに到達したときを除いて、それは魅力のように機能し、ページ番号は前のページにとどまります。幸いなことに、少なくとも内容は変わります。

ここにいくつかのコードがあります:

if(pageController.viewControllers.count != 0){
    ViewPostController *vpc = [pageController.viewControllers objectAtIndex:0];
    NSUInteger retreivedIndex = [self indexOfViewController:vpc];
    self.title = [NSString stringWithFormat:@"%d of %d", retreivedIndex+1, [pageImageContent count]];
}    

- (NSUInteger)indexOfViewController:(ViewPostController *)viewController
{
NSLog(@"indexex %d", [pageNumberArray indexOfObject:viewController.pageNumber]);
return [pageNumberArray indexOfObject:viewController.pageNumber];
}

カウンターが外側の数字に「到達」しない理由を知っている人はいますか?

前もって感謝します

4

1 に答える 1

0

これは古い質問であり、私の答えはトムを悩ませている問題に直接対処することさえできないかもしれませんが、おそらく情報は誰かを助けるでしょう. 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 チュートリアルはすべて、ページごとに再利用される単一のビューコントローラーの使用を示していましたが、ページごとに個別のビューコントローラーがあるため、役に立ちませんでした。

于 2014-06-24T15:09:38.923 に答える