PageViewController current page index in Swift

前端 未结 12 2126
你的背包
你的背包 2021-02-01 15:37

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

func pageViewController(pageViewController: UIPageViewContr         


        
12条回答
  •  情话喂你
    2021-02-01 16:32

    Just check apple's docs (https://developer.apple.com/tutorials/swiftui/interfacing-with-uikit) -> Section 3 -> Step 5

    You can get the current index like this

    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
                if completed,
                    let visibleViewController = pageViewController.viewControllers?.first,
                    let index = parent.controllers.firstIndex(of: visibleViewController)
                {
                    parent.currentPage = index
                }
            }
    

    or if you are keeping viewControllers in an array you can do this

    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
            if completed,
                let visibleViewController = pageViewController.viewControllers?.first,
                let index = orderedViewControllers.firstIndex(of: visibleViewController)
            {
                statisticsPageDelegate?.statisticsPageViewController(statisticsPageViewController: self, didUpdatePageIndex: index)
            }
        }
    

    This is the full code

    class StatisticsPageViewController: UIPageViewController,UIPageViewControllerDataSource, UIPageViewControllerDelegate {
    
        var currentIndex: Int?
        var statisticsPageDelegate: StatisticsPageViewControllerDelegate?
        private var pendingIndex: Int?
    
        required init?(coder aDecoder: NSCoder) {
            super.init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
        }
        override func viewDidLoad() {
            super.viewDidLoad()
            dataSource = self
            delegate = self
    
            if let firstViewController = orderedViewControllers.first {
                setViewControllers([firstViewController],
                                   direction: .forward,
                                   animated: true,
                                   completion: nil)
            }
    
            statisticsPageDelegate?.statisticsPageViewController(
                statisticsPageViewController: self,
                didUpdatePageCount: orderedViewControllers.count
            )
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
        func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
            guard let viewControllerIndex = orderedViewControllers.index(of:viewController) else {
                return nil
            }
    
            let previousIndex = viewControllerIndex - 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? {
            guard let viewControllerIndex = orderedViewControllers.index(of:viewController) else {
                return nil
            }
    
            let nextIndex = viewControllerIndex + 1
            let orderedViewControllersCount = orderedViewControllers.count
    
            guard orderedViewControllersCount != nextIndex else {
                return nil
            }
    
            guard orderedViewControllersCount > nextIndex else {
                return nil
            }
    
            return orderedViewControllers[nextIndex]
        }
    
        func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
            if completed,
                let visibleViewController = pageViewController.viewControllers?.first,
                let index = orderedViewControllers.firstIndex(of: visibleViewController)
            {
                statisticsPageDelegate?.statisticsPageViewController(statisticsPageViewController: self, didUpdatePageIndex: index)
            }
        }
    
        private(set) lazy var orderedViewControllers: [UIViewController] = {
            return [self.newStatisticsViewController(identifier: Identifiers.PROGRAM_VIEW_CONTROLLER),
            self.newStatisticsViewController(identifier: Identifiers.LOGIN_VIEW_CONTROLLER)]
        }()
    
        private func newStatisticsViewController(identifier: String) -> UIViewController {
            return UIStoryboard(name: "Main", bundle: nil) .
                instantiateViewController(withIdentifier: identifier)
        }
    }
    
    protocol StatisticsPageViewControllerDelegate: class {
        func statisticsPageViewController(statisticsPageViewController:
            StatisticsPageViewController, didUpdatePageCount count: Int)
        func statisticsPageViewController(statisticsPageViewController:
            StatisticsPageViewController, didUpdatePageIndex index: Int)
    }
    

提交回复
热议问题