Ios UIPageViewController初始滑动调用两次

Ios UIPageViewController初始滑动调用两次,ios,swift,Ios,Swift,下面的功能是当用户向右滑动时,我如何显示不同的视图 viewControllerAtIndex()是我自己的自定义函数,它返回一个视图。问题是,第一次滑动会输出两次“-----------在0之前滑动”。然后像预期的那样完美地工作 func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIView

下面的功能是当用户向右滑动时,我如何显示不同的视图 viewControllerAtIndex()是我自己的自定义函数,它返回一个视图。问题是,第一次滑动会输出两次“-----------在0之前滑动”。然后像预期的那样完美地工作

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
    print("---------swipe Right before " + String(index))
    index += 1
    print("---------swipe Right " + String(index))

    if index == (products!.count) {
        index = 0
    }

    return self.viewControllerAtIndex(index:index)

}
=====CONSOLE OUTPUT=====
---------swipe Right before 0
---------swipe Right 1
---------swipe Right before 0
---------swipe Right 1

 func viewControllerAtIndex(index: Int) -> ViewController{

   return ViewController.init(id: index)
 }
由于某些原因,在第一次刷卡后,每隔一次刷卡都会按预期工作。初始滑动是导致上面控制台输出的原因。这导致我的视图序列如下所示(2个视图)

我也像这样启动我的uiPageViewController

let array = [ViewController](repeating: ViewController.init(videos: (self.videos![self.products![self.index].id]!)), count: 1)

self.UIViewPageController?.setViewControllers(array, direction: UIPageViewControllerNavigationDirection.forward, animated: false, completion: nil)

因此,我在viewDidLoad上创建一个新的ViewController,然后当用户滑动时,我创建一个新的ViewController,我认为您应该避免使用这种方法进行索引状态管理。苹果不保证在何种情况下调用此方法。如果我必须解释一下,我会说,当框架要求您提供应该在提供的视图控制器之后的视图控制器时,您正在回答一个不同的问题:哪个视图控制器在您之前告诉我们的视图控制器之后


要解决这个问题,您需要使用原始的视图控制器数组,找到该数组中传入的视图控制器的索引,然后返回下一个视图控制器(如果您位于数组末尾,则返回零)。

我认为您应该避免使用此方法进行索引状态管理。苹果不保证在何种情况下调用此方法。如果我必须解释一下,我会说,当框架要求您提供应该在提供的视图控制器之后的视图控制器时,您正在回答一个不同的问题:哪个视图控制器在您之前告诉我们的视图控制器之后

要解决这个问题,您需要使用原始的视图控制器数组,找到该数组中传入的视图控制器的索引,然后返回下一个视图控制器(如果您位于数组末尾,则返回零)。

注释太长。。。 克里斯·特拉希的答案是正确的

我也有同样的问题,因为我误解viewControllerBefore/viewControllerAfter方法的意思是“如果用户向右/向左滑动会发生什么”。正如您所说,这些方法只回答以下问题:“哪个视图控制器位于给定视图控制器之前/之后?”它们应该只回答这个问题,没有任何副作用

某些场景的解决方案是向视图控制器类添加索引属性,并在创建时设置该索引。如果您不是直接使用视图控制器阵列,而是动态创建它们,那么这非常有用。然后,您可以说
vc.index
,而不是说
array.index(of:vc)
。 请看这里:

编辑: 哦,如果你真的想对翻页做出反应,你可以在
pageViewController(uquot:didfinismating:previousViewControllers:transitionCompleted:)
中这样做,评论太长了。。。 克里斯·特拉希的答案是正确的

我也有同样的问题,因为我误解viewControllerBefore/viewControllerAfter方法的意思是“如果用户向右/向左滑动会发生什么”。正如您所说,这些方法只回答以下问题:“哪个视图控制器位于给定视图控制器之前/之后?”它们应该只回答这个问题,没有任何副作用

某些场景的解决方案是向视图控制器类添加索引属性,并在创建时设置该索引。如果您不是直接使用视图控制器阵列,而是动态创建它们,那么这非常有用。然后,您可以说
vc.index
,而不是说
array.index(of:vc)
。 请看这里:

编辑: 哦,如果你真的想对翻页做出反应,你可以在
pageViewController(\uu:didfinismating:previousViewControllers:transitionCompleted:)

中这样做,请看我的答案。请看我的答案。
let array = [ViewController](repeating: ViewController.init(videos: (self.videos![self.products![self.index].id]!)), count: 1)

self.UIViewPageController?.setViewControllers(array, direction: UIPageViewControllerNavigationDirection.forward, animated: false, completion: nil)