我有3个由UIPageViewController控制的视图控制器,如下图所示
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)
}
}
答案 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
函数是您的任务。