【问题标题】:Updating ViewController not updating PageViewController dots更新 ViewController 不更新 PageViewController 点
【发布时间】:2018-03-30 10:15:51
【问题描述】:

我正在尝试展示一个带有 3 个 ContentViewController 的 PageViewController,用户可以在其中从一个页面移动到下一个页面,但也可以使用计时器自动滚动到下一页。

第一个问题:如何让页面视图控制器正确更新页面底部的点。

我已经实现了三页 PageViewController 并有一个基于计时器的自动化。计时器调用:

@objc func animation() {
    if counter < 2  {counter += 1}
    else {counter = 0}        
    self.pageViewController.setViewControllers([self.pageTutorialAtIndex(counter)], direction: UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil)
}

对 setViewControllers 的调用会更改视图。 但是,它不会更新页面底部的 PageViewController 点。需要做些什么来解决这个问题?

显然这个类级别的计数器没有得到当前显示的 ViewContoller,这导致我的第二个问题。

第二个问题:如何正确实现从显示的页面获取当前索引?我试过了:

let current = self.pageTutorialAtIndex(0) as SplashContentViewController
var counter : Int = current.pageIndex!

认为这会读取当前页面,但似乎只读取第 0 页。

类和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)
    }

使用实现委托方法:

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
    }

【问题讨论】:

    标签: ios swift cocoa-touch uipageviewcontroller


    【解决方案1】:

    我似乎找到了一个可能的答案:

    第一个问题:如何让页面视图控制器正确更新页面底部的点。返回当前计数器提供了权利,而不是返回 0。

     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
        }
    }
    

    【讨论】:

    【解决方案2】:

    您好,您已经将当前页面的索引设置在:

    viewControllerBefore 和 viewControllerAfter

    只需在每个函数中返回视图控制器之前创建一个全局变量并存储索引值,类似于

    self.currentIndex = index 
    

    然后返回有问题的视图控制器

    return self.pageTutorialAtIndex(index)
    

    【讨论】:

    • 感谢您的回答,但这与我正在使用的全局“计数器”变量相同。我知道可以在不以这种方式跟踪的情况下获取当前页面。
    猜你喜欢
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多