Setup: I'm trying to create a ViewController with an embedded UIPageViewController with 4 pages that are each their own ViewController.
Problem: When scrolling the second view is always repeated. For example with View1, View2, View3, View4 scrolling reveals View1, View2, View2, View3, View4 then scrolling back has this order View4, View3, View3, View2, View1 even though the page control is accurate.
I've look at many tutorials online including answers here and here.
Here is my page view controller class:
import UIKit
class HostGamePageViewController: ROLViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {
// Constants
let ViewControllers: NSArray = ["HostGameTest1", "HostGameTest2", "HostGameTest3", "HostGameTest4"]
// Properties
var pageViewController: UIPageViewController!
var currentViewController: String!
// UI
@IBOutlet var pageControl: UIPageControl!
override func viewDidLoad() {
super.viewDidLoad()
pageViewController = storyboard?.instantiateViewControllerWithIdentifier("HGPageViewController") as? UIPageViewController
pageViewController.delegate = self
pageViewController.dataSource = self
let startingViewController = viewControllerAtIndex(0)!
pageViewController.setViewControllers([startingViewController], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: {done in })
addChildViewController(pageViewController)
view.addSubview(pageViewController.view)
pageViewController.view.frame = view.bounds
pageViewController.didMoveToParentViewController(self)
view.gestureRecognizers = pageViewController.gestureRecognizers
// Setup page controls
pageControl.numberOfPages = ViewControllers.count
view.bringSubviewToFront(pageControl)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// Get the index of the current page view
func indexOfViewController() -> Int {
if currentViewController != nil {
return ViewControllers.indexOfObject(currentViewController)
}
return NSNotFound
}
// Get the view controller of the given index
func viewControllerAtIndex(index: Int) -> UIViewController? {
if ViewControllers.count == 0 || index >= ViewControllers.count {
return nil
}
pageControl.currentPage = index
currentViewController = ViewControllers[index] as String
return storyboard?.instantiateViewControllerWithIdentifier(currentViewController) as? ROLViewController
}
// Handle clicks on the page control
@IBAction func pageControlClick(sender: UIPageControl) {
var direction: UIPageViewControllerNavigationDirection
if sender.currentPage < indexOfViewController() {
direction = UIPageViewControllerNavigationDirection.Forward
} else {
direction = UIPageViewControllerNavigationDirection.Reverse
}
if let viewController = viewControllerAtIndex(sender.currentPage) {
pageViewController.setViewControllers([viewController], direction: direction, animated: false, completion: nil)
}
}
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
var index = indexOfViewController()
if index == 0 || index == NSNotFound {
return nil
}
index--
return viewControllerAtIndex(index)
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
var index = indexOfViewController()
if index == NSNotFound {
return nil
}
index++
if index == ViewControllers.count {
return nil
}
return viewControllerAtIndex(index)
}
}
and here is a link to a screenshot of my storyboard: http://f.cl.ly/items/0V3W133Q34170q39393Q/Image%202014-09-11%20at%2011.49.44%20AM.png
Am I setting up the dateSource incorrectly? I read somewhere that UIPageViewController does some caching by turning animation to false which is the supposed fix, didn't do anything for me. Any help would be much appreciated. Thanks!