我正在使用UIPageViewController
,我的目的是在其UIButton
中点击一个UIViewController
切换当前视图。我已经用谷歌搜索了我的问题,发现了一些类似的线程,但我无法做出答案的头脑和尾部。
例如,我的第二个UIViewController
vc2
中的按钮将改变视图为vc3
。
根页面视图控制器
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) {
}
在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)
}
}
要么
在MainViewControlle中保留addData方法,并像这样添加协议
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]
}()
}