PageViewController委托函数被调用两次

我正在使用UIPageViewController来为我的应用程序进行产品导览。

我跟着这个链接http://www.appcoda.com/uipageviewcontroller-tutorial-intro/

我正在做的是简单的任务,改变我的“根VC”滑动的背景颜色,基于我得到的索引值,但由于委托函数被调用两次,我的指数值是不正确的,因此,我不是能够得到它的权利,下面是我的代码

#import "APPViewController.h" #import "APPChildViewController.h" @interface APPViewController () @end @implementation APPViewController - (void)viewDidLoad { [super viewDidLoad]; self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; self.pageController.dataSource = self; [[self.pageController view] setFrame:CGRectMake(0, 0, 320, 500)]; APPChildViewController *initialViewController = [self viewControllerAtIndex:0]; NSArray *viewControllers = [NSArray arrayWithObject:initialViewController]; [self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; [self addChildViewController:self.pageController]; [[self view] addSubview:[self.pageController view]]; [self.pageController didMoveToParentViewController:self]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (APPChildViewController *)viewControllerAtIndex:(NSUInteger)index { APPChildViewController *childViewController = [[APPChildViewController alloc] initWithNibName:@"APPChildViewController" bundle:nil]; childViewController.index = index; childViewController.view.backgroundColor = [UIColor clearColor]; if(index == 0) { self.view.backgroundColor = [UIColor redColor]; } if(index == 1) { self.view.backgroundColor = [UIColor blueColor]; } if(index == 2) { self.view.backgroundColor = [UIColor greenColor]; } return childViewController; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { NSUInteger index = [(APPChildViewController *)viewController index]; if (index == 0) { return nil; } // Decrease the index by 1 to return index--; return [self viewControllerAtIndex:index]; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { NSUInteger index = [(APPChildViewController *)viewController index]; index++; if (index == 3) { return nil; } return [self viewControllerAtIndex:index]; } - (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController { // The number of items reflected in the page indicator. return 3; } - (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController { // The selected item reflected in the page indicator. return 0; } 

请帮助我,我没有得到错误的地方

关心Ranjit

找了很多之后

我收到:

 - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController; - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController; 

2个函数用于在当前pageViewController的后面或前面获取pageViewController。

我认为很难得到当前pageViewController

我的build议:

在UIPageViewControllerDelegate中,它有一个函数:

  - (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers; 

这个函数给你一个pendingViewControllers数组,这是当前的pageViewController数组。 所以你可以这样实现:

 - (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers { if([pendingViewControllers count]>0) { NSUInteger index =[(APPChildViewController*)[pendingViewControllers objectAtIndex:0] index]; if(index == 0) { self.view.backgroundColor = [UIColor redColor]; } if(index == 1) { self.view.backgroundColor = [UIColor blueColor]; } if(index == 2) { self.view.backgroundColor = [UIColor greenColor]; } } } 

在viewDidLoad中,添加:

  self.pageController.delegate = self; self.view.backgroundColor = [UIColor redColor]; //set first background. 

在'APPViewController.h'你确定添加:

 @interface APPViewController : UIViewController<UIPageViewControllerDataSource,UIPageViewControllerDelegate> 

记住:删除这个代码(在'viewControllerAtIndex'函数中)

 if(index == 1) { self.view.backgroundColor = [UIColor redColor]; } if(index == 2) { self.view.backgroundColor = [UIColor blueColor]; } if(index == 3) { self.view.backgroundColor = [UIColor greenColor]; } 

让我知道如果你有任何问题。

replace这两个方法并编译,

 - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { NSUInteger index = [(APPChildViewController *)viewController index]; if (index == 0) { self. view.backgroundColor = [UIColor redColor]; return nil; } if(index == 1) { self.view.backgroundColor = [UIColor blueColor]; } if(index == 2) { self.view.backgroundColor = [UIColor greenColor]; } if(index == 3) { self.view.backgroundColor = [UIColor brownColor]; } /*if(index == 4) { self.view.backgroundColor = [UIColor whiteColor]; }*/ // Decrease the index by 1 to return index--; return [self viewControllerAtIndex:index]; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { NSUInteger index = [(APPChildViewController *)viewController index]; /*if(index == 0) { self.view.backgroundColor = [UIColor redColor]; }*/ if(index == 1) { self.view.backgroundColor = [UIColor blueColor]; } if(index == 2) { self.view.backgroundColor = [UIColor greenColor]; } if(index == 3) { self.view.backgroundColor = [UIColor brownColor]; } if(index == 4) { self.view.backgroundColor = [UIColor whiteColor]; return nil; } /*if (index == 5) { return nil; }*/ index++; return [self viewControllerAtIndex:index]; } 

并在- (void)viewDidLoad {

self.view.backgroundColor = [UIColor redColor];

我面临同样的问题,最后找出原因。 当页面视图控制器的Transition样式被设置为“Page Curl”时,委托方法被调用两次。

当转换风格设置为“页面curl”时,动作就像翻书一样。 您打开一个页面,页码递增2.页面视图控制器应用相同的概念,2个视图控制器转换为页面curl样式:一个是您看到的视图控制器,另一个视图控制器在另一侧的curl的看法。

将过渡样式更改为“滚动”,即可摆脱问题

这可以从属性检查器中的故事板完成,如下所示: 检查图像

您也可以通过将UIPageViewController.transitionStyle属性设置为UIPageViewControllerTransitionStyleScroll,通过代码进行更改。

希望能帮助到你