PageViewController current page index in Swift

前端 未结 12 2103
你的背包
你的背包 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:21

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

提交回复
热议问题