iphone - 如果用户移动太快,UIPageViewController View 会困惑

标签 iphone objective-c ios ipad uipageviewcontroller

我有一个 UIPageViewController,它使用一个整数来告诉它在哪个页面上。它工作正常,但如果用户快速滑动几次以到达更靠后的页面,则整数的变化比 View 更快,然后整个事情就崩溃了(应用程序认为它在第 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;
    }
}

最佳答案

问题是您认为 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;
    }
}

注意:此代码不是最佳解决方案 - 我只是想指出您不应该简单地增加/减少 viewControllerAfterViewController: 中的 pageNumber: 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 ...

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

关于iphone - 如果用户移动太快,UIPageViewController View 会困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9777964/

相关文章:

iphone - 如何让 Uilabel 在 iPhone 中闪烁

objective-c - 您如何测量 iOS 线程的实际 on-CPU 时间?

ios - 从服务器下载大数据

ios - RTLabel问题(粗体链接)

ios - Swift - 惰性变量是线程安全的吗?

iphone - iphone开发中如何解决内存分配问题?

iphone - UIImagePickerController 选取多个图像

iphone - NSMutableArray 中的 indexOfObject 返回垃圾值

objective-c - 从代码中隐藏设置捆绑选项

ios - 从 Appstore iOS 阅读评论