PageViewController current page index in Swift

2019-03-17 12:56发布

I want to get current index of a pageViewController, I don't know how I get the visible pages index.

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

}

7条回答
一夜七次
2楼-- · 2019-03-17 13:38

Dont forget to set pageviewcontroller's delegate.

 func createPageViewController() {
    // Create page view controller
    pageViewController = storyboard?.instantiateViewController(withIdentifier: "PageViewController") as? UIPageViewController
    pageViewController?.delegate = self
    pageViewController?.dataSource = self

    let startingViewController: ChildViewController = viewControllerAtIndex(index: 0)!
    let viewControllers: Array = [startingViewController]
    pageViewController?.setViewControllers(viewControllers, direction: .forward, animated: true, completion: nil)

    self.addChildViewController(pageViewController!)
    self.view.frame = CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height)
    self.view.addSubview((pageViewController?.view)!)
    self.pageViewController?.didMove(toParentViewController: self)
}

func viewControllerAtIndex(index: Int) -> ChildViewController? {  
    // return nil here, if there won't be any page in pageviewcontroller

    // Create a new view controller and pass suitable data.
    let pageContentViewController: ChildViewController = storyboard?.instantiateViewController(withIdentifier: "ChildViewController") as! ChildViewController

    pageContentViewController.pageIndex = index
    return pageContentViewController
}

//Also add viewControllerAfter and viewControllerBefore methods

func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
    self.pendingIndex = (pendingViewControllers.first as! ChildViewController).pageIndex
}

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
    if completed {
        self.currentIndex = self.pendingIndex!
        //Perform your task here
    }
}
查看更多
何必那么认真
3楼-- · 2019-03-17 13:39

In Swift 3

Override didFinishAnimating function of UIPageViewControllerDelegate like this:

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

where WalkthroughContentViewController is the UIViewController presented by UIPageViewController

Remember to keep an index variable inside the WalkthroughContentViewController. Also, in the viewDidLoad method set:

delegate = self
查看更多
乱世女痞
4楼-- · 2019-03-17 13:42

Swift 3: full programmatic PageViewController example to get/set the current page index without view tagging:

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

UIPageViewController DataSource implementation:

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
    }
}
查看更多
太酷不给撩
5楼-- · 2019-03-17 13:46

Try it..

func pageViewController(pageViewController: UIPageViewController,didFinishAnimating finished: Bool,previousViewControllers: [UIViewController],transitionCompleted completed: Bool){
guard completed else { return }

self.pageControl.currentPage = pageViewController.viewControllers!.first!.view.tag
    }
查看更多
霸刀☆藐视天下
6楼-- · 2019-03-17 13:48

You can use next method:

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
    guard
        completed,
        let viewControllerIndex = tutorialViews.index(of: pageViewController.viewControllers!.first!) else
            return
        }

    self.currentIndex = viewControllerIndex
}

Where tutorialViews is an array of pages (ViewControllers).
And initialize currentIndex like that:

var currentIndex = 0 {
    didSet {
        self.updateContentForPage(withIndex: currentIndex)
    }
}
查看更多
你好瞎i
7楼-- · 2019-03-17 13:53

You can use didFinishAnimating, and set tags to viewcontrollers. try this

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
}
查看更多
登录 后发表回答