简体   繁体   中英

iOS Swift - Change UIPageViewController page using UISegmentedControl

I finnaly synchronized my segmentedController to the UIPageViewController in this way: when I swipe between pages, the segmented controller changes it's segment index. I want to know how to do the reverse too, when segmentedController's segment is tapped, to change the pageViewController page by segmentedController index. Here is my code:

class photoPageViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate, UINavigationControllerDelegate {


@IBOutlet var segmentedControl: UISegmentedControl!
private var pageViewController: UIPageViewController?
var controllers = [thePageViewController]()
var thePage = thePageViewController()

override func viewDidLoad() {
    super.viewDidLoad()

    createPageViewController()
    setupPageControl()
}

private func createPageViewController() {

    var pageController = self.storyboard!.instantiateViewControllerWithIdentifier("PageController") as! UIPageViewController
    pageController.dataSource = self
    pageController.delegate = self

    var firstController = getItemController(thePage.itemIndex)!
    var startingViewControllers: NSArray = [firstController]
        pageController.setViewControllers(startingViewControllers as [AnyObject], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
    pageViewController = pageController
    addChildViewController(pageViewController!)
    self.view.addSubview(pageViewController!.view)
    pageViewController!.didMoveToParentViewController(self)
}

private func setupPageControl() {
    let appearance = UIPageControl.appearance()

    appearance.pageIndicatorTintColor = UIColor.grayColor()
    appearance.currentPageIndicatorTintColor = UIColor.whiteColor()
    appearance.backgroundColor = UIColor.darkGrayColor()
}

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {

    let itemController = viewController as! thePageViewController

    if itemController.itemIndex > 0 {
        return getItemController(itemController.itemIndex-1)
    }

    return nil
}

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {

    let itemController = viewController as! thePageViewController

    if itemController.itemIndex+1 < 3 {
        return getItemController(itemController.itemIndex+1)
    }

    return nil
}

func getItemController(itemIndex: Int) -> UIViewController? {
    var vc: thePageViewController? = nil
    switch itemIndex {
    case 0:
        vc = self.storyboard!.instantiateViewControllerWithIdentifier("ViewController0") as! firstPhotoViewController
        vc?.itemIndex = itemIndex


    case 1:
        vc = self.storyboard!.instantiateViewControllerWithIdentifier("ViewController1") as! secondPhotoViewController
        vc?.itemIndex = itemIndex


    case 2:
        vc = self.storyboard!.instantiateViewControllerWithIdentifier("ViewController2") as! thirdPhotoViewController
        vc?.itemIndex = itemIndex

    default:
        return nil

    }
    return vc
}

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
    return 3
}

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
    return 0
}

func pageViewController(photoPageViewController: UIPageViewController,
    didFinishAnimating finished: Bool,
    previousViewControllers pageViewController: [AnyObject],
    transitionCompleted completed: Bool)
{
    if (!completed)
    {

        return;
    }

    segmentedControl.selectedSegmentIndex = thePageIndex 
//thePageIndex is a global variable that changes when views from pageViewController appear

}

@IBAction func segmentedFunction(sender: AnyObject) {

    switch segmentedControl.selectedSegmentIndex
    {

    case 0:
        getItemController(0)


    case 1:
        getItemController(1)

    case 2:
        getItemController(2)

    default:
        println("...")
    }

}}   

I think you need to change your code a little bit! In my case I create several vc and put them to one array.

func createArrayOfControllers(){

    newsLenta = self.storyboard?.instantiateViewControllerWithIdentifier("NewsLentaTableViewController") as NewsLentaTableViewController
    mainPage = self.storyboard?.instantiateViewControllerWithIdentifier("MainPageTableViewController") as MainPageTableViewController
    onlinetranslation = self.storyboard?.instantiateViewControllerWithIdentifier("SingleTopicTableViewController") as SingleTopicTableViewController

    tableViewControllers = [newsLenta, mainPage, onlinetranslation]
}

where tableViewController is global var var tableViewControllers = [UITableViewController]() ! I signed type TableViewController because all my vs's are type of table View controller. So the next function you need to change is

func viewControllerAtIndex(index : Int) -> UIViewController? {

        if index > 2 || index < 0 {
            return nil
        }
  return tableViewControllers[index]
    }

In the end you just need to create action of segmentControl and reset your vc by index. Using this function:

func resetToMainPage(index: Int!) {
    /* Getting the page View controller */
    mainPageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("MainPageViewController") as UIPageViewController
    self.mainPageViewController.dataSource = self
    self.mainPageViewController.delegate = self

    let pageContentViewController = self.viewControllerAtIndex(index)
    segmentedControl.selectedSegmentIndex = index
    self.mainPageViewController.setViewControllers([pageContentViewController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)


    self.mainPageViewController.view.frame = CGRectMake(0, 95, self.view.frame.width, self.view.frame.height)
    self.addChildViewController(mainPageViewController)
    self.view.addSubview(mainPageViewController.view)
    self.mainPageViewController.didMoveToParentViewController(self)
}

My question for your how do you update thePageIndex ... I dont get that...

I found the way how to change UIPageViewController's content viewcontroller. I dont know is it right way or wrong but it works. Here is a code: put this to viewdidload:

 segmentControl.addTarget(self, action: "selectPageIndexBySegmentControl", forControlEvents: UIControlEvents.ValueChanged)

put it separte from viewdieload: func selectPageIndexBySegmentControl(){

    switch segmentControl.selectedIndex {
    case 0:
        println("zero index were selected")
        pageContentViewController = self.viewControllerAtIndex(0)
        mainPageViewController.setViewControllers([pageContentViewController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)
    case 1:
        println("first element were selected")
         pageContentViewController = self.viewControllerAtIndex(1)
        mainPageViewController.setViewControllers([pageContentViewController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)
    case 2:
        println("second element were selected")
         pageContentViewController = self.viewControllerAtIndex(2)
        mainPageViewController.setViewControllers([pageContentViewController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)
    default:
        break
    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM