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

Jac*_*ies 7 iphone objective-c ipad ios 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

注:此代码是不是最好的解决办法-我只是想指出的是,你不应该简单地增加/减少pageNumberviewControllerAfterViewController:/viewControllerBeforeViewController:

您还[[... alloc ]init]可以在所有这些之前查看控制器,并最多减少方法中viewControllers的初始化活动(如果它没有加载).例如(缩写):UIPageViewControllerDataSourceloadView

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

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