I'm trying to present a PageViewController with 3 ContentViewControllers where the user can move from one page to the next but also automate the scroll to the next page with a timer.
1st Question: How do I get the Page View Controller to properly update the dots on the bottom of the page.
I've implemented three page PageViewController and have a 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 update the PageViewController dots on the bottom of the page. What needs to be done to fix that?
And obviously this class level counter does not get the currently shown ViewContoller, which leads me to my second question.
2nd Question: How do I properly implement getting the current index from the page shown? I've tried:
let current = self.pageTutorialAtIndex(0) as SplashContentViewController
var counter : Int = current.pageIndex!
thinking that this reads the current page but it seems to only read the page 0.
The class and viewDidLoad are :
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()
// Do any additional setup after loading the view.
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)
}
With the implement delegate 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
}