0

を実装しようとしていUIPageViewControllerます。4 つの個別の viewController を作成してストーリーボードに追加しました。今、私はそれをスクロールしたいと思いますUIPageViewController. これは私がコードで行うことです。

modelArray を作成し、その中にすべての VC を配置しました。

   self.modelArray = [[NSMutableArray alloc] init];
   NSMutableArray *pageData = [[NSMutableArray alloc]init];
    ViewOneViewController *viewOne = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewOne"];
    ViewTwoViewController *viewTwo = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewTwo"];
    ViewThreeViewController *viewThree = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewThree"];
    ViewFourViewController *viewFour = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewFour"];

    [pageData addObject:viewOne];
    [pageData addObject:viewTwo];
    [pageData addObject:viewThree];
    [pageData addObject:viewFour];

    self.modelArray = pageData;

次に の基本をセットアップしUIPageViewController、初期 VC を設定します。

 ViewOneViewController *cVC = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewOne"];
    NSArray *viewControllers = [NSArray arrayWithObject:cVC];
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

    // Add the pageViewController as the childViewController
    [self addChildViewController:self.pageViewController];

    // Add the view of pageViewController  to the currentView
    [self.view addSubview:self.pageViewController.view];

    // Call didMoveToParentViewController: of the childViewController, the UIPageViewController instance in our case.
    [self.pageViewController didMoveToParentViewController:self];

    // Assign the gestureRecognizers property of the pageViewController to the view's gestureRecognizers property
    self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;

最後に、これらは私のdelegateメソッドです (たとえば、次の VC のメソッド)

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
       viewControllerAfterViewController:(UIViewController *)viewController
{
    NSUInteger currentIndex = [self.modelArray indexOfObject:viewController];
    if(currentIndex == self.modelArray.count - 1)
        return nil;

    UIViewController *cVC = [self.modelArray objectAtIndex:currentIndex + 1];
    return cVC;
}

しかし、ビルドして実行すると、次のエラーが発生します。

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 2147483648 beyond bounds [0 .. 3]'

誰でもこれで私を助けることができますか?

よろしく.. 編集

 thread #1: tid = 0x2403, 0x37776350 libsystem_kernel.dylib`__pthread_kill + 8, stop reason = signal SIGABRT
    frame #0: 0x37776350 libsystem_kernel.dylib`__pthread_kill + 8
    frame #1: 0x33115122 libsystem_c.dylib`pthread_kill + 58
    frame #2: 0x33151972 libsystem_c.dylib`abort + 94
    frame #3: 0x36f2fd4e libc++abi.dylib`abort_message + 74
    frame #4: 0x36f2cff8 libc++abi.dylib`default_terminate() + 24
    frame #5: 0x3165ba76 libobjc.A.dylib`_objc_terminate() + 146
    frame #6: 0x36f2d07a libc++abi.dylib`safe_handler_caller(void (*)()) + 78
    frame #7: 0x36f2d114 libc++abi.dylib`std::terminate() + 20
    frame #8: 0x36f2e598 libc++abi.dylib`__cxa_rethrow + 88
    frame #9: 0x3165b9d0 libobjc.A.dylib`objc_exception_rethrow + 12
    frame #10: 0x38c82f20 CoreFoundation`CFRunLoopRunSpecific + 456
    frame #11: 0x38c82d48 CoreFoundation`CFRunLoopRunInMode + 104
    frame #12: 0x34bbc2ea GraphicsServices`GSEventRunModal + 74
    frame #13: 0x35c14300 UIKit`UIApplicationMain + 1120
    frame #14: 0x0005050c Franke2`main(argc=1, argv=0x2fdb1d20) + 116 at main.m:16
    frame #15: 0x340ccb20 libdyld.dylib`start + 4
4

3 に答える 3

2

2147483648 は NSNotFound で-[NSArray indexOfObject:]、オブジェクトが見つからない場合に返されます。

だからあなたのラインで

    NSUInteger currentIndex = [self.modelArray indexOfObject:viewController];

viewControllerはありませんmodelArray。これは、View Controller の新しいインスタンスを毎回作成しているためです。

補足として、あなたはself.modelArray = [[NSMutableArray alloc] init];その配列で何もせずに何もせず、self.modelArray = pageData;. 1 つだけを使用している場合は、そこに 2 つの空の配列を作成する必要はありません。

于 2013-03-13T14:28:36.047 に答える
0

メソッドを呼び出した後、返されたインデックスが魔女でindexOfObject:はないこと、返された値がオブジェクトが配列にないことを確認する必要があります。NSNotFound

コードは次のようになります。

NSUInteger currentIndex = [self.modelArray indexOfObject:viewController];
if(currentIndex == NSNotFound ||
   currentIndex == self.modelArray.count - 1)
    return nil;

将来的には、 Xcode 例外ブレークポイントを使用して、このバグを自分で見つけることができるはずです。

于 2013-03-13T14:32:50.327 に答える
0
 ViewOneViewController *cVC = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewOne"];
 NSArray *viewControllers = [NSArray arrayWithObject:cVC];
 [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

ここでは、ViewOneViewController の新しいオブジェクトを作成し、pageViewController の viewControllers 配列に追加しています。この cVC オブジェクトは、以前に modelArray に追加したものとは関係ありません。これらは両方とも同じクラス、つまり ViewOneViewController の異なるオブジェクトです。

したがって、modelArray から pageViewController の viewControllers 配列に同じオブジェクトを渡して、ガベージ値を取得しないようにする必要があります。

NSUInteger currentIndex = [self.modelArray indexOfObject:viewController]; //will return garbage value in your case

instantiateViewControllerWithIdentifierの議論から:

このメソッドは、呼び出すたびに、指定されたビュー コントローラーの新しいインスタンスを作成します。

于 2013-03-13T14:27:52.243 に答える