Swift - Изменить вид UIPageViewController при нажатии кнопки - PullRequest
0 голосов
/ 25 апреля 2019

Я использую UIPageViewController, и я намерен переключить текущее представление при нажатии UIButton в одном из UIViewController. Я уже погуглил свою проблему и нашел несколько похожих тем, но я не мог придумать ни хвост, ни ответы.

Например, кнопка на моем втором UIViewController vc2 должна изменить вид на vc3.

RootPageViewController

import UIKit

class RootPageViewController: UIPageViewController, UIPageViewControllerDataSource {

    lazy var viewControllerList:[UIViewController] = {

        let sb = UIStoryboard(name: "Main", bundle: nil)

        let vc1 = sb.instantiateViewController(withIdentifier: "timelineView")
        let vc2 = sb.instantiateViewController(withIdentifier: "mainView")
        let vc3 = sb.instantiateViewController(withIdentifier: "addView")

        return [vc1, vc2, vc3]
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.dataSource = self

        let secondViewController = viewControllerList[1]
        self.setViewControllers([secondViewController], direction: .forward, animated: false, completion: nil)

    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        guard let vcIndex = viewControllerList.firstIndex(of: viewController) else { return nil }

        let previousIndex = vcIndex - 1
        guard previousIndex >= 0 else { return nil }

        guard viewControllerList.count > previousIndex else { return nil }

        return viewControllerList[previousIndex]
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        guard let vcIndex = viewControllerList.firstIndex(of: viewController) else { return nil }

        let nextIndex = vcIndex + 1

        guard viewControllerList.count != nextIndex else { return nil }

        guard viewControllerList.count > nextIndex else { return nil }

        return viewControllerList[nextIndex]
    }

}


Кнопка внутри второго ViewController

@IBAction func addData(_ sender: Any) {


    }

1 Ответ

3 голосов
/ 25 апреля 2019

В RootPageViewController viewDidLoad добавить цель кнопки второго вида контроллера к self и добавить метод addData к RootPageViewController.Вы можете использовать setViewControllers и перейти к последнему контроллеру представления в этом методе

override func viewDidLoad() {
    super.viewDidLoad()

    self.dataSource = self
    if let secondViewController = viewControllerList[1] as? SecondViewController {
        self.setViewControllers([secondViewController], direction: .forward, animated: false, completion: nil)
        secondViewController.button.action = #selector(addData(_:))
    }
}
@IBAction func addData(_ sender: Any) {
    if let thirdViewController = viewControllerList.last {
        self.setViewControllers([thirdViewController], direction: .forward, animated: false, completion: nil)
    }
}

ИЛИ

Сохранить метод addData в MainViewControlle и добавить к нему протокол, напримерthis

protocol MainVCDelegate {
    func buttonPlusTapped()
}
class MainViewController: UIViewController {

    @IBOutlet var buttonPlus: UIBarButtonItem!

    var delegate: MainVCDelegate?
    @IBAction func addData(_ sender: Any) {
        delegate?.buttonPlusTapped()
    }
}

В RootPageViewController подтвердите этому делегату и добавьте метод делегата

class RootPageViewController: UIPageViewController, UIPageViewControllerDataSource, MainVCDelegate {

    func buttonPlusTapped() {
        if let thidViewController = viewControllerList.last {
            self.setViewControllers([thidViewController], direction: .forward, animated: false, completion: nil)
        }
    }

    lazy var viewControllerList:[UIViewController] = {

        let sb = UIStoryboard(name: "Main", bundle: nil)

        let vc1 = sb.instantiateViewController(withIdentifier: "timelineView")
        let vc2 = sb.instantiateViewController(withIdentifier: "mainView") as! MainViewController
        vc2.delegate = self
        let vc3 = sb.instantiateViewController(withIdentifier: "addView")
        return [vc1, vc2, vc3]
    }()
}
...