代码之家  ›  专栏  ›  技术社区  ›  Elia Crocetta

检测UIPageViewController的当前页面

  •  5
  • Elia Crocetta  · 技术社区  · 7 年前

    下面是我的委托方法和ViewController数组:

    lazy var VCArr: [UIViewController] = {
        let firstVC = self.storyboard!.instantiateViewController(withIdentifier: "FirstTutorialPage")
        let secondVC = self.storyboard!.instantiateViewController(withIdentifier: "SecondTutorialPage")
        let thirdVC = self.storyboard!.instantiateViewController(withIdentifier: "ThirdTutorialPage")
        let fourthVC = self.storyboard!.instantiateViewController(withIdentifier: "FourthTutorialPage")
        return [firstVC, secondVC, thirdVC, fourthVC]
    }()
    

    委托方法

        func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
    
        guard let viewControllerIndex = self.VCArr.index(of: viewController) else {
            return nil
        }
    
        let previousIndex = viewControllerIndex - 1
    
        guard previousIndex >= 0 else {
            return nil
        }
    
        guard self.VCArr.count > previousIndex else {
            return nil
        }
    
        return self.VCArr[previousIndex]
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        guard let viewControllerIndex = self.VCArr.index(of: viewController) else {
            return nil
        }
    
        let nextIndex = viewControllerIndex + 1
    
        guard nextIndex < self.VCArr.count else {
            return nil
        }
    
        guard self.VCArr.count > nextIndex else {
            return nil
        }
    
        return self.VCArr[nextIndex]
    }
    

    谢谢大家。

    5 回复  |  直到 7 年前
        1
  •  11
  •   Francesco    6 年前

    我的解决方案在于实现该功能 pageViewController(_:didFinishAnimating:previousViewControllers:transitionCompleted:) UIPageViewControllerDelegate

    if completed {
        if let currentViewController = pageViewController.viewControllers?.first,
        let index = pages.index(of: currentViewController) {
            currentIndex = index
        }
    }
    

    哪里 pages 是我的页面视图控制器的属性,我在其中存储要显示的所有视图控制器,并且 currentIndex 是一个属性,用于跟踪当前页面的索引(也称为视图控制器),以便在代码的其他部分中使用它。

        2
  •  0
  •   Sergey Bystrov    7 年前

    尝试获取第一个视图控制器

        if let vc = pageViewController.viewControllers?[0] {
            ... vc is current controller...
        }
    

    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
        if let vc = pageViewController.viewControllers?[0] {
            ... vc is current controller...
        }
    }
    
        3
  •  0
  •   nao    7 年前

    尝试此委托方法。

    var currentIndex = 0
    
    func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
        guard let nextViewController = pendingViewControllers[0] as? ViewController else { return }
        self.currentIndex = nextViewController.index
    }
    
        4
  •  0
  •   Francojamesfan    5 年前

    像这样设置didFinishAnimating pageViewController数据源函数。存储数据源的属性。在这种情况下,我将其命名为 orderedViewControllers 。然后当您滑动时,当前索引将打印到控制台。

    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
        let pageContentViewController = pageViewController.viewControllers![0]
        let index = orderedViewControllers.index(of: pageContentViewController)!
        print(index)
    }
    
        5
  •  -1
  •   Szu    7 年前

    在这里,您可以使用 % 操作人员

    let nextIndex = (viewControllerIndex + 1) % VCArr.count
    let previousIndex = (VCArr.count + viewControllerIndex - 1) % VCArr.count