7

我有一个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;
    }
}
4

1 回答 1

9

问题是你认为pageNumber理所当然。UIPageViewController只能要求 nextviewController预加载它,而您已经在增加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]可以在所有这些之前查看控制器,并将方法中视图控制器的初始化活动减少到最多如果未加载)。例如(缩写):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 ...

对于更多页面,您还可以尝试标记视图控制器(在它们的初始化期间)。由于UIViewController它本身没有标签属性,您可能可以使用viewController.view.tag或 sublcasUIViewController并将其添加一个pageNumber属性(这可能接近解决方案。

于 2012-03-19T23:31:55.300 回答