如何从UIPageViewController内的视图控制器返回到上一个VC或下一个VC?

时间:2019-06-13 00:25:36

标签: ios swift viewcontroller uipageviewcontroller

我有3个由UIPageViewController控制的视图控制器,如下图所示

enter image description here https://i.stack.imgur.com/9Lqoj.png

如果我轻扫屏幕,它将从RedVC移至BlueVC和YellowVC。

我要在BlueVC中制作下一个按钮和后退按钮 。因此,如果用户按下后退按钮,它将进入RedVC,如果用户按下下一个按钮,它将进入YellowVC。该怎么做?

这是我在根页面视图控制器中的代码:

import UIKit

class RootPageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {

    lazy var viewControllerList : [UIViewController] = {
        let storyBoard = UIStoryboard(name: "Main", bundle: nil)

        let redVC = storyBoard.instantiateViewController(withIdentifier: "redVC")
        let blueVC = storyBoard.instantiateViewController(withIdentifier: "blueVC")
        let yellowVC = storyBoard.instantiateViewController(withIdentifier: "yellowVC")

        return [redVC,blueVC,yellowVC]
    }() 


    // to add dot indicator
    var pageControl = UIPageControl()




    override func viewDidLoad() {
        super.viewDidLoad()


        self.dataSource = self
        self.delegate = self

        configurePageControl()
        turnIntoPage()

    }




    func turnIntoPage() {
        // set view controllers to be pages

        if let firstViewController = viewControllerList.first {
            // if so then set the direction
            self.setViewControllers([firstViewController], direction: .forward, animated: true, completion: nil)
        }
    }




    // MARK: - Page View Controller Data Source functions
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {

        // a method that will handle view controller before current view controller

        // make precaution , if the lodic is wrong then return nil (prevent index out of logic)
        guard let vcIndex = viewControllerList.index(of: viewController) else { return nil}
        let previousIndex = vcIndex - 1
        guard previousIndex >= 0 else { return nil}
        guard viewControllerList.count > previousIndex else {return nil}


        // return the value
        return viewControllerList[previousIndex]
    }


    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {

        // a method that will handle view controller after current view controller

        // make precaution , if the lodic is wrong then return nil (prevent index out of logic)
        guard let vcIndex = viewControllerList.index(of: viewController) else { return nil}
        let nextIndex = vcIndex + 1
        guard viewControllerList.count != nextIndex else {return nil}
        guard viewControllerList.count > nextIndex else {return nil}

         // return the value
        return viewControllerList[nextIndex]


    }




     // to add dot indicator


    // MARK: Page View Controller Delegate functions
    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
        let pageContentViewController = pageViewController.viewControllers![0]
        self.pageControl.currentPage = viewControllerList.index(of: pageContentViewController)!
    }


    func configurePageControl() {

        // The total number of pages that are available is based on how many available colors we have.
        pageControl = UIPageControl(frame: CGRect(x: 0,y: UIScreen.main.bounds.maxY - 50,width: UIScreen.main.bounds.width,height: 50))
        self.pageControl.numberOfPages = viewControllerList.count
        self.pageControl.currentPage = 0
        self.pageControl.tintColor = UIColor.black
        self.pageControl.pageIndicatorTintColor = UIColor.white
        self.pageControl.currentPageIndicatorTintColor = UIColor.black
        self.view.addSubview(pageControl)
    }




}

1 个答案:

答案 0 :(得分:0)

因此,在您的RootPageViewController中,您可以在其中使用将使用setViewControllers的函数。

setViewControllers被描述为:

  

//设置可见的视图控制器,可以选择设置动画。数组   应该只包括在   动画已完成。       //对于过渡样式'UIPageViewControllerTransitionStylePageCurl',如果'doubleSided'为   '是',并且脊椎位置不是   'UIPageViewControllerSpineLocationMid',两个视图控制器必须是   包括在内,因为后一个视图控制器用作后盖。

因此,我们尝试使用一个Next函数。

func next() {
    let vcs = self.viewControllerList
    //or self.viewControllers
    let currentPage = self.pageControl.currentPage
    let nextPage = currentPage + 1

    if nextPage < vcs.count {
        let nextVC = vcs[nextPage]
        self.setViewControllers([nextVC], direction: .forward, animated: true) { _ in
            self.pageControl.currentPage = nextPage
        }
    }
}

如您所见,我们从您在代码中创建的vcs安全地获取了一个viewController,其中包含所有页面。在获得下一个viewController之后,如果有的话,我们使用setViewControllers。为了使其更好,我们正在设置currentPage中的pageControl,以告诉pageController底部的哪个圆圈要着色。

然后从您的BlueVC中获得pageController的引用。怎么样?通过访问self.parent并将其转换为您的RootPageViewController。像这样:

@IBAction func next(_ sender: Any) {
    if let parentVC = self.parent as? RootPageViewController {
        parentVC.next()
    }
}

现在,实现previous函数是您的任务。