我有一个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;
}
}
答案 0 :(得分: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;
}
}
注意:此代码不是最佳解决方案 - 我只是想指出,您不应该只是在pageNumber
/ viewControllerAfterViewController:
中增加/减少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 ...
对于更多页面,您还可以尝试标记viewControllers(在初始化期间)。由于UIViewController
本身没有标记属性,您可以使用viewController.view.tag
或sublcass UIViewController
并添加pageNumber
属性(这可能接近于解决方案。