I am trying to imagine a PageViewController with 3 ContentViewControllers where a user can navigate from one page to another, and also automate scrolling to the next page using a timer.
Question 1: How to get the page view controller to correctly update the dots at the bottom of the page.
I have implemented three pages of PageViewController and have timer based automation. The timer calls:
@objc func animation() {
if counter < 2 {counter += 1}
else {counter = 0}
self.pageViewController.setViewControllers([self.pageTutorialAtIndex(counter)], direction: UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil)
}
This call to setViewControllers changes the view. However, it does not refresh the PageViewController dots at the bottom of the page. What needs to be done to fix this?
And obviously, this class level counter does not get the ViewContoller currently displayed, which leads me to my second question.
The second question: How to correctly get the current index from the page shown? I tried:
let current = self.pageTutorialAtIndex(0) as SplashContentViewController
var counter : Int = current.pageIndex!
thinking it reads the current page, but it seems that it only reads page 0.
Class and viewDidLoad:
class SplashViewController: UIViewController, UIPageViewControllerDataSource {
var pageImages:NSArray!
var pageTitles:[String]!
var pageTexts:[String]!
var pageViewController:UIPageViewController!
var waitTimer : Timer!
var counter : Int = 0
override func viewDidLoad() {
super.viewDidLoad()
pageImages = NSArray(objects:"sp_image1","sp_image2","sp_image3")
pageTitles = [NSLocalizedString("sp_title1",comment: ""), NSLocalizedString("sp_title2", comment: ""), NSLocalizedString("sp_title3", comment: "")]
pageTexts = [NSLocalizedString("sp_detail1",comment: ""), NSLocalizedString("sp_detail2", comment: ""), NSLocalizedString("sp_detail3", comment: "")]
self.pageViewController = self.storyboard?.instantiateViewController(withIdentifier: "SplashPageViewController") as! UIPageViewController
self.pageViewController.dataSource = self
let initialContenViewController = self.pageTutorialAtIndex(0) as SplashContentViewController
self.pageViewController.setViewControllers([initialContenViewController], direction: UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil)
self.addChildViewController(self.pageViewController)
self.view.addSubview(self.pageViewController.view)
self.pageViewController.didMove(toParentViewController: self)
}
Using delegation methods:
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController?
{
let viewController = viewController as! SplashContentViewController
var index = viewController.pageIndex as Int
if(index == 0 || index == NSNotFound){return nil}
index -= 1
return self.pageTutorialAtIndex(index)
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
{
let viewController = viewController as! SplashContentViewController
var index = viewController.pageIndex as Int
if((index == NSNotFound)){return nil}
index += 1
if(index == pageImages.count){return nil}
return self.pageTutorialAtIndex(index)
}
func presentationCount(for pageViewController: UIPageViewController) -> Int
{
return pageImages.count
}
func presentationIndex(for pageViewController: UIPageViewController) -> Int
{
return 0
}