UIPageViewController在iOS6中

在iOS6中的方法viewControllerAfterViewControllerviewControllerBeforeViewController如果我返回零(用于阻止页面导航,当我在第一页或最后一页)应用程序崩溃与此exception:

'所提供的视图控制器的数量(0)与请求的转换所需的数量(1)不匹配'

在iOS5中一切正常。

我遇到过同样的问题。 我发现原因是取代了UIPageViewController的UIPanGestureRecognizer上的委托,这真是一个不争的事实。 平移手势识别器正在调用一个未logging的方法_gestureRecognizerShouldBegin :(注意前导下划线)UIPageViewController实现并显然依赖正常工作(阅读:不是崩溃)。 我最终实现了respondsToSelector:和forwardingTargetForSelector:在我的类中使用UIPageViewController将未logging的委托方法传递给UIPageViewController而没有专门命名它(几乎肯定会给我一个app store评论拒绝)。

 -(BOOL)respondsToSelector:(SEL)aSelector { if ([super respondsToSelector:aSelector]) return YES; else if ([self.pageViewController respondsToSelector:aSelector]) return YES; else return NO; } - (id)forwardingTargetForSelector:(SEL)aSelector { if ([super respondsToSelector:aSelector]) { return nil; } else if ([self.pageViewController respondsToSelector:aSelector]) { return self.pageViewController; } return nil; } 

我的长期解决scheme将是重新使用UIPageViewController,使我不需要取代手势识别代表。

啊,想知道为什么没有人指出这个错误,我花了差不多两个晚上找出解决scheme。

OLD CODE(iOS 5.1):在第一页和最后一页返回零时,您将遇到应用程序crash.It在iOS 5.1中正常工作,但在iOS 6中则不会。

 - (UIViewController *)pageViewController: (UIPageViewController *)pageViewController viewControllerBeforeViewController: (UIViewController *)viewController { for (UIGestureRecognizer *recognizer in pageController.gestureRecognizers) { if ([recognizer isKindOfClass:[UITapGestureRecognizer class]]) { recognizer.enabled = NO; } } NSUInteger index = [self indexOfViewController: (MainViewController *)viewController]; if ((index == 0) || (index == NSNotFound)) { return nil; } index--; return [self viewControllerAtIndex:index]; } - (UIViewController *)pageViewController: (UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { for (UIGestureRecognizer *recognizer in pageController.gestureRecognizers) { if ([recognizer isKindOfClass:[UITapGestureRecognizer class]]) { recognizer.enabled = NO; } } NSUInteger index = [self indexOfViewController: (MainViewController *)viewController]; if (index == NSNotFound) { return nil; } } 

解决scheme(iOS 6):将手势效果添加到超级视图后,只需调用名为 – (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer的委托。 我所做的是安静简单,计算用户翻转第一页和最后一页的速度(我的意思是使用手势识别器),我否认了滑动。所有你需要做的就是粘贴下面的代码,你完成!

 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { if (pageNum==0) { if ([(UIPanGestureRecognizer*)gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [(UIPanGestureRecognizer*)gestureRecognizer velocityInView:gestureRecognizer.view].x > 0.0f) { //NSLog(@"Swiping to left on 1st page is denied"); return NO; } if ([(UITapGestureRecognizer*)gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]] && [(UITapGestureRecognizer*)gestureRecognizer locationInView:gestureRecognizer.view].x < self.view.frame.size.width/2) { //NSLog(@"tapping to left on 1st page is denied"); return NO; } } else if(pageNum ==totalNoOfFiles-1) { if ([(UIPanGestureRecognizer*)gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [(UIPanGestureRecognizer*)gestureRecognizer velocityInView:gestureRecognizer.view].x < 0.0f) { //NSLog(@"Swiping to right on 1st page is denied"); return NO; } if ([(UITapGestureRecognizer*)gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]] && [(UITapGestureRecognizer*)gestureRecognizer locationInView:gestureRecognizer.view].x > self.view.frame.size.width/2) { //NSLog(@"Tapping to right on 1st page is denied"); return NO; } } return YES; } - (UIViewController *)pageViewController:(UIPageViewController*) pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { int index = [self indexOfViewController:(ChildViewController *)viewController]; index--; return [self viewControllerAtIndex:index]; } - (UIViewController *)pageViewController: (UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { int index = [self indexOfViewController:(ChildViewController *)viewController]; index++; return [self viewControllerAtIndex:index]; } 

这已经很好的讨论了,但我有一件事要补充。 考虑你为什么要将手势识别器的代表设置为自我。 在我的情况下,这是因为在某些情况下,我想阻止手势识别器识别,与代表的手势识别器gestureRecognizerShouldBegin:

但是在iOS 6中,出现这个问题时,通过在UIView上实现gestureRecognizerShouldBegin:有一个全新的方法。 (这是iOS 6中的一个新的UIView实例方法)

因此,我能够完成我以前完成的工作,而不改变手势识别器的代表。

我遇到了UIPageViewController与iOS6崩溃的问题('提供的视图控制器的数量(0)与请求的转换所需的数量(1)不匹配')。

上述解决scheme都没有为我工作,但我最终发现,将下面的行从viewDidLoad移动到viewDidAppear修复它。

 self.view.gestureRecognizers = self.pageViewController.gestureRecognizers; 

完全相同的问题在这里。

我所做的是一个修补程序,它只是返回之前/ afterViewController而不是零的克隆,即

 // viewController = before/afterViewController NSUInteger index = [self indexOfViewController:viewController]; // NOTE: return nil crashes in iOS6 return [self viewControllerAtIndex:index storyboard:viewController.storyboard]; 

这意味着你可以永久页面curl,但我没有别的select…总是欢迎更好的解决scheme。