首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIPageViewController in iOS6

UIPageViewController in iOS6
EN

Stack Overflow用户
提问于 2012-09-24 12:51:34
回答 5查看 9K关注 0票数 20

在方法viewControllerAfterViewControllerviewControllerBeforeViewController中的iOS6中,如果返回nil (在第一页或最后一页时阻止页面导航),则应用程序崩溃,但有此例外:

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

在iOS5中,一切都很好。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-09-24 22:10:06

我也有过同样的问题。我发现原因是取代了UIPanGestureRecognizer of UIPageViewController的代表,这是不-不是的。pan手势识别器调用了_gestureRecognizerShouldBegin:(注意前面的下划线)方法,UIPageViewController实现了该方法,并且显然依赖于正确工作(读:不崩溃)。最后,我实现了respondsToSelector:和forwardingTargetForSelector:在我的类中,它使用UIPageViewController将无文档的委托方法传递给UIPageViewController,而没有具体地命名它(几乎可以肯定,这给我带来了应用程序商店的审查拒绝)。

代码语言:javascript
复制
-(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;
}

我的长期解决方案将是重新使用UIPageViewController,这样我就不需要替换手势识别器委托。

票数 28
EN

Stack Overflow用户

发布于 2012-10-08 06:47:56

啊,我想知道为什么没有人指出这个问题,我花了将近两个晚上才找到解决办法。

旧代码( iOS 5.1):当在第一页和最后一页返回零时,您将体验到应用程序crash.It在iOS 5.1中工作得很好,但在iOS 6中却不会。

代码语言:javascript
复制
- (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;
    }
}

解决方案( -(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer 6):在将手势效果添加到superview之后,只需调用名为iOS*的委托gestureRecognizer即可。我所做的是安静而简单的,计算用户翻转第一页和最后一页的速度(我指的是使用手势识别器),我否认您需要做的swiping.All只是粘贴以下代码,您就完成了!

代码语言:javascript
复制
- (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];
}
票数 12
EN

Stack Overflow用户

发布于 2012-10-17 16:39:44

这一点已经讨论过了,但我有一件事要补充。请考虑为什么要将手势识别器的委托设置为self。在我的例子中,这是因为在某些情况下,我想防止手势识别器与委托的gestureRecognizerShouldBegin:识别。

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

因此,我能够完全完成我以前所做的事情,而不改变手势识别器的代表。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12565400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档