как вернуться к предыдущему VC или следующему VC из контроллера представления внутри UIPageViewController? - PullRequest
0 голосов
/ 13 июня 2019

У меня есть 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 голосов
/ 13 июня 2019

Итак, в вашем RootPageViewController может быть функция, которая будет использовать setViewControllers.

И это setViewControllers описывается как:

// Установить контроллеры видимого представления, опционально с анимацией.Массив должен включать только контроллеры представления, которые будут видны после завершения анимации.// Для стиля перехода «UIPageViewControllerTransitionStylePageCurl», если «doubleSided» - «YES», а расположение позвоночника - не «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
        }
    }
}

Как вы можете видеть, мы благополучно получаем viewController из vcs, который вы сделали в своем коде, который содержит всестраницы.И после того, как мы получим следующий viewController, если он есть, мы используем setViewControllers.Чтобы сделать его лучше, мы устанавливаем currentPage вашего pageControl, чтобы указать, какой круг в нижней части вашего контроллера страницы должен быть цветным.

А затем из вашего BlueVC получите ссылку наВаша страница Контроллер.Как?Получив доступ к self.parent и разыграйте его как RootPageViewController.Вот так:

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

Теперь ваша задача - реализовать функцию previous.

...