在我的项目中,我使用了一个从故事板添加一些viewControllers的UIPageViewController。我在这里做了一个非常简单的示例项目:http://www.2shared.com/file/Rz0G1b5C/pageScroll.html (选择iPhone模拟器),正如你所看到的,我得到了错误The number of provided view controllers (3) doesn't match the number required (1) for the requested spine location (在我的实际项目中,它是transition而不是spine location,但是我做的每件事都与我的实际项目中相同。我已经搜索了堆栈溢出,但找不到我的问题的任何答案。
发布于 2013-04-03 21:40:37
当我第一次使用页面视图控制器时,我很难弄明白这一点,但这是因为你一次给页面视图控制器提供了所有的视图控制器,所以它试图同时显示3个视图控制器,但这种类型的书脊一次只支持一个视图控制器。那么为什么它一次需要超过1个呢?如果您将书脊放在页面的中间(我想在iPad上更常见),您可以同时显示两个视图控制器,因此每次都需要向page view Controller提供一个数组。在大多数情况下,您只想显示一个对象,因此在运行setViewControllers时,您应该只将初始页面作为单对象数组放入控制器中。
要翻转页面,需要在示例代码中将Page View Controller设置为UIPageViewControllerDataSource,然后使用这些函数来调入和调出所需的控制器。数据源提供了viewControllerAfterViewController和viewControllerBeforeViewController函数,您可以使用它们来确定数组中的下一个视图控制器。您的数组和控制器都是在本地声明的,所以当我这样做时,我使用的一种方法是使数组成为头文件中的一个变量,您可以在整个Page View Controller中引用该变量,而不是像您在示例中那样在viewDidLoad中本地声明它。像在viewDidLoad中一样填充它,然后只将包含first对象的数组发送到setViewControllers中。
NSArray *initialViewControllers = [[NSArray alloc] initWithObjects:[viewControllersArray objectAtIndex:0], nil];
[self setViewControllers:initialViewControllers
direction:UIPageViewControllerNavigationDirectionForward
animated:YES
completion:^(BOOL finished){
NSLog(@"call back success");}];因此,在这些数据源函数中,您可以找出当前视图控制器在视图控制器数组中的位置,然后返回下一个索引中的那个,对于viewControllerAfterViewController,返回前一个索引中的那个;对于viewControllerBeforeViewController,返回前一个索引中的那个
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
if ([viewControllersArray containsObject:viewController]) {
NSInteger index = [viewControllersArray indexOfObject:viewController];
if (index < [viewControllersArray count] && index > 0) {
return [viewControllersArray objectAtIndex:(index - 1)];
}
}
return nil;
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
if ([viewControllersArray containsObject:viewController]) {
NSInteger index = [viewControllersArray indexOfObject:viewController];
if (index < [viewControllersArray count] - 1) {
return [viewControllersArray objectAtIndex:(index + 1)];
}
}
return nil;
}通过实现这些功能,您在页面视图控制器中一次只有一个视图控制器,并且您可以根据需要对它们进行调入和调出。它们会保存在你的viewControllerArray中,这样你就可以切换回原来的控制器了。
https://stackoverflow.com/questions/15788458
复制相似问题