Swift中的PageViewController当前页面索引

LeN*_*eNI 26 uiviewcontroller uipagecontrol ios uipageviewcontroller swift

我想获取pageViewController的当前索引,我不知道如何获取可见页面索引.

func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool,previousViewControllers: [UIViewController],transitionCompleted completed: Bool)
{
    // How to get it?

}
Run Code Online (Sandbox Code Playgroud)

man*_*ukv 30

您可以使用didFinishAnimating,并将标签设置为viewcontrollers.试试这个

func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool)
{
   if (!completed)
  {
    return
  }
  self.pageControl.currentPageIndex = pageViewController.viewControllers!.first!.view.tag //Page Index
}
Run Code Online (Sandbox Code Playgroud)

  • 但是`pageViewController.viewControllers!.first!.view.tag`总是为'0`,因为它总是第一个:( (13认同)
  • **这现在非常简单**向下滚动到@igor的答案。对于任何在这里谷歌搜索的人,不要使用这个非常过时的答案。 (3认同)

Igo*_*gor 25

将此代码添加到您的UIPageViewController.

var pages = [UIViewController]()
var currentIndex: Int {
    guard let vc = viewControllers?.first else { return 0 }
    return pages.firstIndex(of: vc) ?? 0
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*inz 9

Swift 3:完整的程序化PageViewController示例,用于获取/设置当前页面索引而不使用视图标记:

enum PageViewType:String {
        case green = "greenView"
        case blue = "blueView"
        case red = "redView"  
}

class MyPageViewController: UIPageViewController {

    private (set) lazy var orderedViewControllers:[UIViewController] = {
         return [self.newPageView(.green),
                self.newPageView(.blue),
                self.newPageView(.red)
        ]
    }

    var currentIndex:Int {
            get {
                return orderedViewControllers.index(of: self.viewControllers!.first!)!
            }

            set {
                guard newValue >= 0,
                    newValue < orderedViewControllers.count else {
                    return
                }

                let vc = orderedViewControllers[newValue]
                let direction:UIPageViewControllerNavigationDirection = newValue > currentIndex ? .forward : .reverse            
                self.setViewControllers([vc], direction: direction, animated: true, completion: nil) 
            }
        }

    override func viewDidLoad() {
        super.viewDidLoad()

        dataSource = self

        if let firstViewController = orderedViewControllers.first {
            setViewControllers([firstViewController],
                           direction: .forward,
                           animated: true,
                           completion: nil)
        }
    }

    private func newPageView(_ viewType:PageViewType) -> UIViewController {
        let vc = self.storyboard?.instantiateViewController(withIdentifier: viewType.rawValue)       
        return vc
    }
}
Run Code Online (Sandbox Code Playgroud)

UIPageViewController DataSource实现:

extension MyPageViewController:UIPageViewControllerDataSource {

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {

        let previousIndex = currentIndex - 1

        guard previousIndex >= 0 else {
            return nil
        }

        guard orderedViewControllers.count > previousIndex else {
            return nil
        }

        return orderedViewControllers[previousIndex]   
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {         
        let nextIndex = currentIndex + 1

        guard orderedViewControllers.count != nextIndex else {
            return nil
        }

        guard orderedViewControllers.count > nextIndex else {
            return nil
        }

        return orderedViewControllers[nextIndex]
    }

    func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
        return orderedViewControllers.count
    }

    func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {

        return currentIndex
    }
}
Run Code Online (Sandbox Code Playgroud)


Geo*_*kas 9

在Swift 3中

像这样覆盖UIPageViewControllerDelegate的didFinishAnimating函数:

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
    if completed {
        if let currentViewController = pageViewController.viewControllers![0] as? WalkthroughContentViewController {
            pageControl.currentPage = currentViewController.index
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

其中WalkthroughContentViewController是UIPageViewController提供的UIViewController

请记住在WalkthroughContentViewController中保留一个索引变量.另外,在viewDidLoad方法集中:

delegate = self
Run Code Online (Sandbox Code Playgroud)


Fro*_*eon 5

首先,让 UIPageViewController 实现 UIPageViewControllerDataSource 方法presentationIndex(for pageViewController: UIPageViewController) -> Int以返回每个 PageViewController 的 ViewController 的索引。

然后在您的委托中,通过传入的 PageViewController 访问数据源:

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
    guard let dataSource = pageViewController.dataSource, 
          let currentIndex = dataSource.presentationIndex?(for: pageViewController) else { preconditionFailure() }

}
Run Code Online (Sandbox Code Playgroud)