0

I'm using PageViewController and tab bar. And I have a question which is 'how to move another view by touching button.' My app has 5 ViewControllers and they are on PageViewController. And the PageViewController is on ViewController. That ViewController is MainController. So I separated Main view, with about 4 : 1(PageViewController : tab bar). So tab bar is on MainController, MainController can changes ViewController when tab item is touched.

But what I want to make is a button on one of five ViewControllers which can change ViewController.

The button has not right to change ViewController. So I searched how to solve this problem but It couldn't find good solution.

I think the solution is very short, about 1 ~ 2 sentences.

I attached my code, so I hope anybody who know how to solve this problem please helps me.

I'm new in Swift, so explain detail please

This is a part of 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)
}

....
Tanvir Nayem
  • 702
  • 10
  • 25
  • 1
    https://stackoverflow.com/a/45095847/5461400 – Harshal Valanda Jun 25 '18 at 09:05
  • Possible duplicate of [How to jump to a particular page with UIPageViewController?](https://stackoverflow.com/questions/45095539/how-to-jump-to-a-particular-page-with-uipageviewcontroller) – Harshal Valanda Jun 25 '18 at 09:20
  • @HarshalValanda thank you for comment. But that way what you notice is already used my code. That is worked on ViewController(MainController), but it doesn't work on five ViewControllers(example : HomeVC or AccessVC). I want to know how to change ViewController on HomeVC to AccessVC in HomeVC by touching button. So I didn't think it is duplicated. – young taek Jun 26 '18 at 00:25

1 Answers1

0

You can use this code it might be help you.

 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)
        }

    }
Ravish Kumar
  • 239
  • 2
  • 12
  • thank you for comment. but I cann't understand your comment... I know 'extension' should be write down seperate with class. So I got that error message like 'Value of type 'UIViewController' has no member 'viewControllers' and 'Use of unresolved identifier 'dataSource' and 'setViewControllers'. – young taek Jun 26 '18 at 00:50