UIPageViewController 取消页面滑动

Posted

技术标签:

【中文标题】UIPageViewController 取消页面滑动【英文标题】:UIPageViewController cancel page swipe 【发布时间】:2014-04-23 17:31:32 【问题描述】:

我有一个有 7 页的 UIPageViewController。用户必须在每个页面中输入所有必填字段,然后才能进入下一页。如果用户没有输入必填字段,我应该显示一个警告弹出窗口,如果他试图转到下一页,则让用户保持在同一页面中。有谁知道如果用户没有输入必填字段,我如何取消页面滑动并使用户保持在同一页面中?

谢谢, 阿南德。

【问题讨论】:

【参考方案1】:

如果您有 pageviewcontroller 的数据源,则可以为该方法返回 nil:

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

您可能从一开始就设置了所有视图控制器,但为此您需要设置初始视图控制器,并从数据源方法提供下一个和上一个视图控制器。

它不会禁用滚动视图中的滚动,这意味着用户可以滚动并“反弹”到最后一页。

编辑: 请注意,UIPageViewController 会缓存来自其数据源的答案;当您返回给定索引的答案时,它不会再次询问,直到滚动足够远或您手动设置 viewControllers。

为了使您的刷新工作,作为一种解决方法,您可以调用:

pageViewcontroller setViewControllers:[pageViewcontroller viewControllers]                                     direction:UIPageViewControllerNavigationDirectionForward
                                       animated:NO
                                     completion:nil];

使其删除缓存并再次从您的数据源请求控制器。 (感谢道格拉斯希尔)

【讨论】:

如果您将返回值更改为UIPageViewControllerDataSource 方法,UIPageViewController 将不会再次自动调用这些方法。没有标准的方法来通知它您的更改 - 类似于 UITableViewreloadData。强制重新加载的解决方法是将UIPageViewController 的视图控制器设置为其当前值:[pageViewController setViewControllers:[pageViewController viewControllers] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]。您指定的方向无关紧要。 @DouglasHill 你是对的,当你想以编程方式刷新页面控制器时,这就是你需要做的。我从用户手动更改页面的问题中了解到。所以在数据完成之前不返回控制器是完全可行的,并且不需要刷新。当用户在数据完成后滑动时,将返回下一个控制器。 你试过了吗?我做到了,页面视图控制器跟踪数据源提供的最后一个值。假设你在一个页面上,一开始没有下一页,然后发生了一些事情(表格被填写)并且变成了下一页;滚动仍然会反弹,因为页面视图控制器不知道您刚刚添加的页面。必须告知它从其数据源重新加载。 @DouglasHill 我现在在一个演示项目中尝试过,但它不起作用。我的回答不正确。 UIPageViewController 似乎缓存了来自数据源的响应,并且在再次设置视图控制器之前它不会再次询问它。因此,解决方案是返回 nil 或数据源中的视图控制器,并且还如您提到的那样强制刷新。 我很累返回 nil 但它没有用。将其设置为 nil 后,我输入了所有必需的数据并尝试再次滑动到下一页,但 pageviewcontroller 没有加载下一页,因为它已经将下一页缓存为 nil。

以上是关于UIPageViewController 取消页面滑动的主要内容,如果未能解决你的问题,请参考以下文章

UIPageViewController:每页更改页面指示器/页面控件的颜色

页面指​​示器 UIPageViewController

将页面控件设置到 UIPageViewController 的顶部

UIPageControl(页面控件)不显示在 UIPageViewController

添加页面时 UIPageViewController 崩溃

UIPageViewController 如何访问不可见页面