ViewController update not updating PageViewController points

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()
        // 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)
    }

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
    }
+4
source share
2 answers

I seem to have found one possible answer:

1st question . How to get a pageview controller to correctly update points at the bottom of the page. Instead of returning 0, returning the current counter gives the right.

 func presentationIndex(for pageViewController: UIPageViewController) -> Int
{
    return counter
}

: ? . , .

:

func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController?
{
    let viewController = viewController as! SplashContentViewController
    let index = viewController.pageIndex as Int

    if(index == NSNotFound){
        return nil
    }
    if(index > 0){
        counter = index - 1
        return self.pageTutorialAtIndex(counter)
    } else {
        counter = 0
        return nil
    }
}

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
{
    let viewController = viewController as! SplashContentViewController
    let index = viewController.pageIndex as Int
    if((index == NSNotFound)){
        return nil
    }
    if (index < pageImages.count - 1) {
        counter = index + 1
        return self.pageTutorialAtIndex(counter)
    } else {
        counter = pageImages.count - 1
        return nil
    }
}
+3

, :

viewControllerBefore viewControllerAfter

, -

self.currentIndex = index 

return self.pageTutorialAtIndex(index)
0

Source: https://habr.com/ru/post/1695570/


All Articles