在我的项目中,我使用 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
然而我所做的一切都和我的真实项目一样。我已经搜索了堆栈溢出,但找不到任何问题的答案。
1 回答
当我第一次使用页面视图控制器时,我最难弄清楚这一点,但发生这种情况是因为你同时为页面视图控制器提供了所有视图控制器,所以它试图同时显示 3 个但这种类型书脊一次仅支持 1 个视图控制器。那为什么一次需要超过1个呢?如果你把书脊放在页面的中间(我想在 iPad 上更常见),你可以同时显示两个视图控制器,所以你每次都需要将一个数组输入到页面视图控制器中。在大多数情况下,您只想显示一个,因此当您运行时setViewControllers
,您应该只将初始页面作为一个对象数组放入控制器中。
你想要做的翻页是在你的示例代码中将你的页面视图控制器设置为 UIPageViewControllerDataSource,然后使用这些函数来页面进出你想要的控制器。数据源提供viewControllerAfterViewController
和viewControllerBeforeViewController
函数,您可以使用它们来确定数组中的下一个视图控制器。你的数组是在本地声明的,你的控制器也是如此,所以当我这样做时,一种对我有用的方法是使数组成为你在整个页面视图控制器中引用的头文件中的变量,而不是在本地声明它viewDidLoad
正如您在示例中所做的那样。像你现在一样填写它viewDidLoad
,但然后只发送一个包含第一个对象的数组到setViewControllers
.
NSArray *initialViewControllers = [[NSArray alloc] initWithObjects:[viewControllersArray objectAtIndex:0], nil];
[self setViewControllers:initialViewControllers
direction:UIPageViewControllerNavigationDirectionForward
animated:YES
completion:^(BOOL finished){
NSLog(@"call back success");}];
因此,在这些数据源函数中,您会找出当前视图控制器在视图控制器数组中的位置,然后返回下一个索引中的一个 for viewControllerAfterViewController
,或者返回上一个索引中的一个 for 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
,因此您可以翻转回您离开的同一个控制器。