iOS6中的UIPageViewController

Mat*_*eri 20 iphone objective-c ios uipageviewcontroller

在iOS6中的方法viewControllerAfterViewControllerviewControllerBeforeViewController如果我返回nil(当我在第一页或最后一页时阻止页面导航)应用程序崩溃时出现此异常:

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

在iOS5中,一切都很好.

小智 29

我遇到过同样的问题.我发现原因是在UIPageViewController的UIPanGestureRecognizer上替换了委托,这是不行的.平移手势识别器正在调用一个未记录的方法_gestureRecognizerShouldBegin :(注意前导下划线)UIPageViewController实现并显然依赖于正常工作(读取:not-crash).我最终在我的类中实现了respondsToSelector:和forwardingTargetForSelector:它使用UIPageViewController将未记录的委托方法传递给UIPageViewController,而没有专门命名它(几乎肯定会让我获得应用商店评论拒绝).

-(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;
}
Run Code Online (Sandbox Code Playgroud)

我的长期解决方案是重写UIPageViewController的使用,这样我就不需要取代手势识别器代理.


Mas*_*oke 12

啊,想知道为什么没有人指出这个错误,我花了将近2个晚来找出解决方案.

旧代码(iOS 5.1):在第一页和最后一页返回nil时,您将遇到应用程序崩溃.它在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

解决方案(iOS 6):将手势效果添加到superview后,只需调用名为 - (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];
}
Run Code Online (Sandbox Code Playgroud)


mat*_*att 7

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

但是在出现这个问题的iOS 6中,通过gestureRecognizerShouldBegin:在UIView上实现,有一种全新的方法可以做到这一点.(这是iOS 6中新的UIView实例方法.)

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