ios - (Swift)如何使用触摸按钮更改 pageviewcontroller 中的视图
问题描述
我正在使用PageViewController
和标签栏。我有一个问题是“如何通过触摸按钮移动另一个视图”。我的应用程序有 5 个 ViewControllers,它们在PageViewController
. 并且PageViewController
在 ViewController 上。该 ViewController 是 MainController。所以我用大约 4:1(PageViewController:标签栏)分隔主视图。所以标签栏在 MainController 上,当标签项被触摸时,MainController 可以更改 ViewController。
但我想做的是五个 ViewController 之一上的一个按钮,它可以改变 ViewController。
按钮无权更改 ViewController。所以我搜索了如何解决这个问题,但找不到好的解决方案。
我觉得解法很短,大概1~2句话。
我附上了我的代码,所以我希望任何知道如何解决这个问题的人都可以帮助我。
我是 Swift 新手,请详细说明
这是 MainController 的一部分
import UIKit
class ViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
var pageViewController: UIPageViewController!
var subVC: [UIViewController] = []
var viewIndex: Int = 0
var tabIndicator1 = UIView()
var tabIndicator2 = UIView()
var tabIndicator3 = UIView()
var tabIndicator4 = UIView()
var tabIndicator5 = UIView()
var views = [UIView]()
override func viewDidLoad() {
super.viewDidLoad()
createVC() // make five ViewControllers
self.pageViewController = self.storyboard?.instantiateViewController(withIdentifier: "PageViewController") as! UIPageViewController
self.pageViewController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
self.pageViewController.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
self.addChildViewController(self.pageViewController)
self.view.addSubview(self.pageViewController.view)
let startVC = subVC[0]
viewIndex = 0
let viewControllers = NSArray(object: startVC)
self.pageViewController.setViewControllers(viewControllers as? [UIViewController], direction: .forward, animated: true, completion: nil)
self.pageViewController.didMove(toParentViewController: self)
createTabBar() // make Tab Bar
createIndicator() // make Tab Indicator
self.pageViewController.dataSource = self
self.pageViewController.delegate = self
}
...
func createVC() { // I have five ViewController files
let HomeVC = VCInstance(name: "Home")
let AccessVC = VCInstance(name: "AccessLog")
let RegisterVC = VCInstance(name: "Register")
let SettingVC = VCInstance(name: "Setting")
let HelpVC = VCInstance(name: "Help")
subVC = [HomeVC, AccessVC, RegisterVC, SettingVC, HelpVC]
}
func VCInstance(name: String) -> UIViewController {
return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: name)
}
....
解决方案
您可以使用此代码,它可能会对您有所帮助。
extension UIViewController {
func goNextPage(animated: Bool = true) {
guard let currentViewController = self.viewControllers?.first else { return }
guard let nextViewController = dataSource?.pageViewController(self, viewControllerAfter: currentViewController) else { return }
setViewControllers([nextViewController], direction: .forward, animated: animated, completion: nil)
}
func goPreviousPage(animated: Bool = true) {
guard let currentViewController = self.viewControllers?.first else { return }
guard let previousViewController = dataSource?.pageViewController(self, viewControllerBefore: currentViewController) else { return }
setViewControllers([previousViewController], direction: .reverse, animated: animated, completion: nil)
}
}
推荐阅读
- javascript - 正确使用
- c# - C# Problem with Windows.Forms.NumericUpDown binding
- linux - Sed 在模式上多次插入行
- firebase - Firebase crashlytics crash reporting via proxy
- python - Kivy 文本输入小部件:对“绑定”属性感到困惑
- node.js - 从 mongo 数据库中检索图像 [multer express nodejs]
- angular6 - ANGULAR 6 ERROR Uncaught (in promise): Error: Cannot match any routes. URL Segment: '**'
- angular - How to periodically poll information in Angular 5 using Observables and also have immediate fetch using RxJs 5.x?
- java - 在一个事务中从调度程序调用 2 个服务方法的最佳方法
- javascript - Maze drawing with canvas