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