Bogdan Bogdanov
Bogdan Bogdanov

Reputation: 992

Swift - Implementing PageViewController in one UIViewController

Nowhere in internet is explain how to implement PageViewController in your UIViewController I take this code from default XCode Page-Based Application

class ViewController: UIViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {
    var pageViewController: UIPageViewController?
    override func viewDidLoad() {
        self.pageViewController = UIPageViewController(transitionStyle: .PageCurl, navigationOrientation: .Horizontal, options: nil)
        self.pageViewController!.delegate = self
        self.view.addSubview(self.pageViewController!.view)
        // Set the page view controller's bounds using an inset rect so that self's view is visible around the edges of the pages.
        var pageViewRect = self.view.bounds
        self.pageViewController!.view.frame = pageViewRect
        self.pageViewController!.didMoveToParentViewController(self)
        // Add the page view controller's gesture recognizers to the book view controller's view so that the gestures are started more easily.
        self.view.gestureRecognizers = self.pageViewController!.gestureRecognizers
    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
     //?? what controller should I return
    }
    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
    //?? what controller should I return
    }
}

I want to have 6 pages and I want to add text in different pages how to recognize in which page I am and show the info that I want? I want to use only 1 ViewControler, only this view controller.

Upvotes: 1

Views: 1750

Answers (1)

pwightman
pwightman

Reputation: 794

UIPageViewController requires that you use different view controllers. You may need to refactor your code to have a "parent" or "root" view controller, whose only job is to present other view controllers that implement the logic for specific pages. Here's some sample code. It's oversimplified but should give you an idea of how to get going.

class PageContent {
    let text: String
    let index: Int
    init(text: String, index: Int) {
        self.text = text
        self.index = index
    }
}

class MyPageViewController : UIViewController {
    var page: PageContent!
    override func viewDidLoad() {
        // Load page data for self.page
    }
}

class ViewController: UIViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {
    var pageViewController: UIPageViewController?
    var pages: [PageContent]!

    override func viewDidLoad() {
        let firstPage = PageContent(text: "...", index: 0)
        let secondPage = PageContent(text: "...", index: 1)
        // ...
        self.pages = [firstPage, secondPage] // add more as necessary
    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
        let beforeController = viewController as MyPageViewController
        let newPageIndex = beforeController.page.index - 1
        if newPageIndex >= 0 {
            let newController = MyPageViewController()
            newController.page = self.pages[newPageIndex]
            return newController
        } else {
            return nil
        }
    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
        let afterController = viewController as MyPageViewController
        let newPageIndex = afterController.page.index + 1
        if newPageIndex < self.pages.count {
            let newController = MyPageViewController()
            newController.page = self.pages[newPageIndex]
            return newController
        } else {
            return nil
        }
    }
}

Upvotes: 2

Related Questions