如果用户移动太快,UIPageViewController视图会搞乱

时间:2012-03-19 21:07:54

标签: iphone objective-c ios ipad uipageviewcontroller

我有一个UIPageViewController,它使用一个整数来判断它在哪个页面上。它工作正常,但如果用户快速滑动几次以进一步返回页面,整数变化的速度比视图更快,然后整个事情就会崩溃(应用程序认为它在第7页可能是显示第3页)。我究竟做错了什么?我应该用不同的方法来判断我在哪里吗?感谢。

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
    if (pageNumber == 0) {
        pageNumber++;
        NSLog(@"%i", pageNumber);
        Two *two = [[Two alloc] init];
        return two;
    } else if (pageNumber == 1) {
        pageNumber++;
        NSLog(@"%i", pageNumber);
        Three *three = [[Three alloc] init];
        return three;
    } else if (pageNumber >= 2) {
        return nil;
    } else {
        return nil;
    }
}

1 个答案:

答案 0 :(得分:9)

问题在于你认为pageNumber是理所当然的。 UIPageViewController只能要求下一个viewController预加载它,而您已经增加pageNumber

当你注意到“如果用户抓住页面的边缘并开始移动它,但随后将其放回当前页面时,这种情况也会发生。”

此方法获取参数UIViewController,这是您拥有的唯一真实参考

由于您只有三页,解决此问题的方法之一是:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    if ([viewController isKindOfClass: [One class]])
    {
        Two *two = [[Two alloc] init];
        return two;
    }
    else if ([viewController isKindOfClass: [Two class]])
    {
        Three *three = [[Three alloc] init];
        return three;
    }
    else
    {
        return nil;
    }
}

注意:此代码不是最佳解决方案 - 我只是想指出,您不应该只是在pageNumber / viewControllerAfterViewController:中增加/减少viewControllerBeforeViewController:

在此之前你还可以[[... alloc ]init] viewControllers并将UIPageViewControllerDataSource方法中viewControllers的初始化活动减少到loadView(如果它没有加载)。例如(缩写):

    ...
    if ([viewController isKindOfClass: [One class]])
    {
        //Two *two = [[Two alloc] init]; //called before and two is someone's property
        if (![two isViewLoaded]) [two loadView];
        return two;
    }
    else if ...

对于更多页面,您还可以尝试标记viewControllers(在初始化期间)。由于UIViewController本身没有标记属性,您可以使用viewController.view.tag或sublcass UIViewController并添加pageNumber属性(这可能接近于解决方案。