UIPageViewController viewControllerAfterViewController 一旦返回 nil 就不会被调用

Posted

技术标签:

【中文标题】UIPageViewController viewControllerAfterViewController 一旦返回 nil 就不会被调用【英文标题】:UIPageViewController viewControllerAfterViewController not called after once returned nil 【发布时间】:2014-07-29 13:24:47 【问题描述】:

我正在尝试通过验证每一步来实现UIPageViewController。我的代码在没有验证的情况下工作正常,所以所有页面似乎都做得很好。这是我的代码:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
    int index = [(MyViewController *) viewController index];
    index--;
    return [_viewModel viewControllerAtIndex:index];


- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
    BOOL isDataValid = [(MyViewController *) viewController validateData];
    if (isDataValid) 
        int index = [(MyViewController *) viewController index];
        index++;
        return [_viewModel viewControllerAtIndex:index];
    
    return nil;

我的问题是,当显示第 1 步时,会调用 viewControllerAfterViewController 来准备第 2 步,但是因为第 2 步无效(用户没有机会输入数据)所以它返回 nil。我希望UIPageViewController 每次用户尝试滑动到下一个屏幕并且在收到零后不放弃时调用viewControllerAfterViewController。可行吗?

【问题讨论】:

【参考方案1】:

UIPageViewController 有一个底层缓存。你可以重置它

pageViewController.dataSource = nil;
pageViewController.dataSource = self;

一旦你所在的页面生效,你就可以调用它。

【讨论】:

成功了!子视图控制器的内容视图是否变得有效并不容易观察,但现在它正在工作! 在哪里调用这个方法@Lou Franco 这对我不起作用。我在 UIPageViewController 显示的页面的 viewDidAppear 中执行了 2 行,仅供参考。【参考方案2】:

遇到类似问题,我添加了以下代码(仅调用添加子视图是不够的)

[self addChildViewController:vc];
[_viewCarouselContainer addSubview:vc.view];
[vc didMoveToParentViewController:self];

现在这两种方法都可以在各自的滑动中正确调用

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController ;

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController ;

【讨论】:

以上是关于UIPageViewController viewControllerAfterViewController 一旦返回 nil 就不会被调用的主要内容,如果未能解决你的问题,请参考以下文章

如何快速阻止 UIPageViewController 的滑动手势?

UIPageViewController 结合安全区

带有PageControl的UIPageViewController

Swift - UIPageViewController中的UIPinchGestureRecognizer

容器视图内的 UIPageViewController 内的堆栈视图的自动布局?

UIPageViewController 的视图框架在 iOS 上是不可预测的