我有一个 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/