Swift - Промяна на изгледа на UIPageViewController при натискане на бутон

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

Например, бутонът във второто ми 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) {


    }

person Tom    schedule 25.04.2019    source източник
comment
можеш ли да зададеш известител?   -  person Ravi Padsala    schedule 25.04.2019
comment
@RaviPadsala Съжалявам, но съм нов в Swift. Бихте ли илюстрирали отговора си в отговор по-долу?   -  person Tom    schedule 25.04.2019
comment
можете да промените позицията на pagecontroller в същия клас при щракване на бутон?   -  person Ravi Padsala    schedule 25.04.2019


Отговори (1)


В viewDidLoad на RootPageViewController добавете целта на втория бутон на контролера за изглед към 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 и добавете протокол към него по този начин

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]
    }()
}
person RajeshKumar R    schedule 25.04.2019
comment
Коментарите не са за разширена дискусия; този разговор беше преместен в чат. - person Samuel Liew♦; 26.04.2019