这是一个老问题,我的回答甚至可能无法直接解决困扰汤姆的问题,但也许这些信息会对某人有所帮助。UIPageViewController 困扰了我好几天。我的错误是假设这些方法只在翻页时被调用:
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
实际上,它们似乎在翻页期间被多次调用。我currentPage
在主视图控制器中有一个变量,每当调用这两种方法时我都会递增/递减它,但它会产生类似于 Tom 描述的奇怪行为。我仍然使用这些方法(你必须这样做),但是以不同的方法进行递增/递减。这些方法如下所示:
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
if (self.currentPage==0) {
return nil;
}
else {
return [[self pageArray] objectAtIndex:self.currentPage-1];
}
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
if (self.currentPage==self.pageArray.count-1)
{
return nil;
}
else
{
return [[self pageArray] objectAtIndex:self.currentPage+1];
}
}
的增量/减量currentPage
发生在此方法中:
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
if (completed)
{
int currentIndex = ((UIViewController *)[self.pageViewController.viewControllers objectAtIndex:0]).view.tag;
self.currentPage = currentIndex;
}
}
要使用此方法,您必须添加两个协议
<UIPageViewControllerDataSource, UIPageViewControllerDelegate>
不只是数据源,并将委托设置为 self
self.pageViewController.delegate=self;
否则不会调用该方法。我使用视图标签来确定每个页面的索引,但还有其他方法可以获得这个数字。有关获取当前页面索引的方法的讨论,请参阅本文:
UIPageViewController:返回当前可见视图
我在网上找到的 UIPageViewController 教程都显示了对每个页面重复使用的单个视图控制器的使用,这对我没有帮助,因为我为每个页面都有一个单独的视图控制器。