如何使用按钮在 UIPageViewController 中向前和向后导航?

Posted

技术标签:

【中文标题】如何使用按钮在 UIPageViewController 中向前和向后导航?【英文标题】:How do I navigate forward and backward within UIPageViewController using buttons? 【发布时间】:2017-12-22 19:51:46 【问题描述】:

我正在为一家物理治疗诊所的新患者创建一个入职应用程序。新患者将在UIPageViewController 内的每个视图控制器上回答问题,然后点击按钮转到下一个问题。

我按照教程设置了我的 UIPageViewController PageVC 以及 3 个视图控制器。 PageVC 当前通过滑动更改页面,但我希望能够使用两个按钮在视图控制器中向后和向前导航,这些按钮是 PageVC 本身的子视图。我该如何做到这一点?

我喜欢使用UIPageViewController 并想进一步了解它。如果除了使用UIPageViewController 之外还有更有效的方法来完成同样的任务,我很乐意考虑。

    class PageVC: UIPageViewController, UIPageViewControllerDataSource 

        private(set) lazy var orderedViewControllers: [UIViewController] = 
            return [self.VCInstance(name: "BodyChart"),
                    self.VCInstance(name: "Symptoms"),
                    self.VCInstance(name: "HadSurgery")]
        ()

        private func VCInstance(name: String) -> UIViewController 
            return UIStoryboard(name: "Main", bundle: nil) .
                instantiateViewController(withIdentifier: name)
        

        func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? 
            guard let viewControllerIndex = orderedViewControllers.index(of: viewController) else 
                return nil
            

            let previousIndex = viewControllerIndex - 1

            guard previousIndex >= 0 else 
                return nil
            

            guard orderedViewControllers.count > previousIndex else 
                return nil
            

            return orderedViewControllers[previousIndex]
        

        func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? 
            guard let viewControllerIndex = orderedViewControllers.index(of: viewController) else 
                return nil
            

            let nextIndex = viewControllerIndex + 1
            let orderedViewControllersCount = orderedViewControllers.count

            guard orderedViewControllersCount != nextIndex else 
                return nil
            

            guard orderedViewControllersCount > nextIndex else 
                return nil
            

            return orderedViewControllers[nextIndex]
        

        override func viewDidLoad() 
            super.viewDidLoad()

            dataSource = self

            if let firstViewController = orderedViewControllers.first 
                setViewControllers([firstViewController], direction: .forward, animated: true, completion: nil)
            
        

 

【问题讨论】:

可能重复:link 【参考方案1】:

我想你要找的是here. 但这是另一种方式。

UIPageViewController 有一个实例方法转换。下面的sn-p会从第一页子视图控制器移动到第二页。

pageViewController.transition(from: pageViewController.viewControllers[0], to: pageViewController.viewControllers[1], duration: 0.3, options: UIViewAnimationOptions.curveEaseInOut, animations: nil, completion: nil)

PageVC 目前通过滑动来更改页面,但我希望能够使用两个按钮在视图控制器中前后导航

将您的按钮添加到页面内容,然后禁用horizontal scrolling on PageVC's scrollview 或以有礼貌的方式禁用视图的用户交互。

【讨论】:

以上是关于如何使用按钮在 UIPageViewController 中向前和向后导航?的主要内容,如果未能解决你的问题,请参考以下文章

UIPageViewController 手势覆盖我的 UITableView

在 UIPageViewController 中获取用户滑动方向

UIPageViewControllers UIPageControl 在过渡期间出现故障

UIPageControl 将图像移到它上面(而不是在它上面)

swift ios 以编程方式设置 PageViewController 的过渡样式和方向

在mfc中如何使用按钮依次输入数据