如果用户移动得太快,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; } } 

问题是,你正在采取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;  } } 

注意:这个代码不是最好的解决scheme – 我只是想指出,你不应该简单地增加/减lesspageNumber中的viewControllerAfterViewController: / viewControllerBeforeViewController:

你也可以在所有这些之前[[... alloc ]init] viewController,并减lessUIPageViewControllerDataSource方法中的UIPageViewControllerDataSource 初始化活动 ,以UIPageViewControllerDataSource 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属性(这可能会接近解决scheme。