错误:页面控制跳转两次单页交换

Posted

技术标签:

【中文标题】错误:页面控制跳转两次单页交换【英文标题】:Error: Page Control jump twice with single page swap 【发布时间】:2016-02-16 19:24:41 【问题描述】:

使用以下代码,页面控件在单页交换期间跳转了两次而不是一次。我需要将UIPageViewController 添加为子视图,如下所示,如何使页面控件正确运行?谢谢!

import UIKit

class ViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate

    var pageViewController: UIPageViewController!
    let pagesArray = ["Page1ViewController", "Page2ViewController","Page3ViewController"]
    let pageControl : UIPageControl = UIPageControl(frame: CGRectMake(100, 600, 200, 20))


    func viewControllerAtIndex(index: Int) -> UIViewController? 
        let vc = storyboard?.instantiateViewControllerWithIdentifier (pagesArray[index])
        return vc
    

    func pageViewController(pageViewController:UIPageViewController,
        viewControllerBeforeViewController
        viewController: UIViewController) -> UIViewController?

            if var index = pagesArray.indexOf(viewController.restorationIdentifier!)
                if index > 0 
                    index--
                    self.pageControl.currentPage = index
                    return viewControllerAtIndex(index)
                
            
            return nil
    

    func pageViewController(pageViewController:UIPageViewController,
        viewControllerAfterViewController
        viewController: UIViewController) -> UIViewController?

            if var index = pagesArray.indexOf(viewController.restorationIdentifier!)
                if index < pagesArray.count - 1 
                    index++
                    return viewControllerAtIndex(index)
                
            
            return nil
    

    override func viewDidLoad() 
        super.viewDidLoad()

        pageControl.numberOfPages = 3
        pageControl.currentPage = 0
        pageControl.tintColor = UIColor.redColor()
        pageControl.pageIndicatorTintColor = UIColor.blackColor()
        pageControl.currentPageIndicatorTintColor = UIColor.orangeColor()

        if let vc = storyboard?.instantiateViewControllerWithIdentifier("MyPageViewController")
        
            self.addChildViewController(vc)
            self.view.addSubview(vc.view)
            self.view.addSubview(pageControl)

            pageViewController = vc as! UIPageViewController
            pageViewController.dataSource = self
            pageViewController.delegate = self
            pageViewController.setViewControllers([viewControllerAtIndex(0)!], direction: .Forward, animated: true, completion: nil)
            pageViewController.didMoveToParentViewController(self)
        
    

【问题讨论】:

如果故事板上有页面视图控制器,为什么要在另一个视图控制器中实例化它? 因为我稍后会进行登录检查,如果用户没有登录,根视图控制器会将他带到定向页面(UIPageViewController)。如果用户已经登录,根视图控制器应该将他带到主内容页面。 我希望页面控件(那些点指示器)位于所有内容之上。所以我用 addSubView 的方式做页面。 【参考方案1】:

试试这个

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? 


     let identifier = viewController.restorationIdentifier

     self.index = self.identifiers.indexOfObject(identifier!)

     if index == identifiers.count - 1 
          return nil
     

     //increment the index to get the viewController before the current one
     self.index = self.index + 1

     return self.viewControllerAtIndex(self.index)

 

 func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? 
 

      let identifier = viewController.restorationIdentifier

      self.index = self.identifiers.indexOfObject(identifier!)

      if index == 0 

           return nil
      

      //decrement the index to get the viewController before the current one
      self.index = self.index - 1

      return self.viewControllerAtIndex(self.index)

 

  func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int 
 
        return self.identifiers.count
 

  func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int 
 
        return 0
 

【讨论】:

谢谢你,我试过了。我需要先在某处声明“self.index”和“self.identifier”吗?在函数中无法识别它们。 @AAC 是的 self.identifiers 将是您的标识符数组,在您的情况下它将是 self.pagesArray @AAC 并且不需要全局声明索引。我创建了全局变量来跟踪我当前的索引。在您的代码中,您使用了索引的本地声明。 对不起。那么在索引值更改后我应该把'pageControl.currentPage=index'放在哪里?我已经放入了“viewControllerAfterViewController”和“viewControllerBeforeViewController”功能。这使得页面指示器(pageControl)中突出显示的点在我只滑动一次页面时跳转了两次。这是我面临的问题。感谢您的帮助! 或者我是否应该尝试检测页面滑动完成或成功,然后更改'pageControl.currentPage'的值?

以上是关于错误:页面控制跳转两次单页交换的主要内容,如果未能解决你的问题,请参考以下文章

D12

单页应用及多页应用

解决vue单页路由跳转后scrollTop的问题

vue 单页应用点击某个链接,跳转到新页面的方式

单页应用和多页应用

浅谈单页应用和多页应用——Vue.js向