【问题标题】:UIPageViewController errorUIPageViewController 错误
【发布时间】:2013-04-03 13:19:00
【问题描述】:

在我的项目中,我使用 UIPageViewController 从情节提要中添加一些 viewController。我在这里做了一个非常简单的示例项目: 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,但是我所做的一切都与我的真实项目中相同。我已经已经搜索过堆栈溢出,但找不到我的问题的任何答案。

【问题讨论】:

    标签: iphone ios objective-c


    【解决方案1】:

    当我第一次使用页面视图控制器时,我最难弄清楚这一点,但发生这种情况是因为你同时为页面视图控制器提供了所有视图控制器,所以它试图同时显示 3 个但是这种类型的书脊一次只支持 1 个视图控制器。那为什么一次需要超过1个呢?如果你把书脊放在页面的中间(我想在 iPad 上更常见),你可以同时显示两个视图控制器,所以你每次都需要将一个数组输入到页面视图控制器中。在大多数情况下,您只想显示一个,因此当您运行setViewControllers 时,您应该只将您的 initial 页面作为一个对象数组放入控制器中。

    你想要做的翻页是在你的示例代码中将你的页面视图控制器设置为 UIPageViewControllerDataSource,然后使用这些函数来页面进出你想要的控制器。数据源提供viewControllerAfterViewControllerviewControllerBeforeViewController 函数,您可以使用它们来确定数组中的下一个视图控制器。你的数组是在本地声明的,你的控制器也是如此,所以当我这样做时,一种对我有用的方法是使数组成为你在整个页面视图控制器中引用的头文件中的变量,而不是在本地声明它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 中,因此您可以返回到您离开的同一个控制器。

    【讨论】:

    • 我编辑了第一个代码 sn-p 以具有与示例代码中相同的完成参数:)
    • 感谢您的帮助,这是我目前得到的 2shared.com/file/NNjVcNmW/pageScroll.html,因为您可以看到有一个错误,我不确定如何将故事板上的那些 viewController 添加到浏览量控制器?您能否编辑我的代码并将其上传到 www.2shared.com 我将不胜感激我正在努力解决这个问题
    • 您实际上已经非常接近让它工作了!取消注释 myViewController、myViewController2 和 myViewController 3 的 UIViewController 行,从 UIViewController *myViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"myviewc"]; 开始,到 [viewControllersArray addObject: myViewController3]; 结束。然后不是在 initialViewControllers 段中说 viewControllers,而是应该说 viewControllersArray,那是我的错误。你也忘了设置数据源,所以把self.dataSource = self添加到viewDidLoad
    • 好吧,这似乎可行,但它仍然只显示第一个视图控制器,我需要做什么才能使滑动事件显示其他 VC?
    • 如果添加self.dataSource = self,它应该会自动实现刷卡。我刚刚在我的 iPhone 上试了一下,它工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多