Jac*_*ies 7 iphone objective-c ipad ios 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;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是你是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;
}
}
Run Code Online (Sandbox Code Playgroud)
注:此代码是不是最好的解决办法-我只是想指出的是,你不应该简单地增加/减少pageNumber
的viewControllerAfterViewController:
/viewControllerBeforeViewController:
您还[[... alloc ]init]
可以在所有这些之前查看控制器,并最多减少方法中viewControllers的初始化活动(如果它没有加载).例如(缩写):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 ...
Run Code Online (Sandbox Code Playgroud)
对于更多页面,您还可以尝试标记viewControllers(在初始化期间).由于UIViewController
它本身没有标签属性,你可以使用viewController.view.tag
或者sublcass UIViewController
并添加一个pageNumber
属性(这可能接近于解决方案.