【问题标题】:UIPageViewController does not work properlyUIPageViewController 无法正常工作
【发布时间】:2014-11-08 23:15:44
【问题描述】:

我正在开发一个 iOS 应用程序,我使用 UIPageViewController 为该应用程序实现了一个演示之旅,在每个视图控制器上我显示一个图像和一个视频,但是方法

 pageViewController:ViewControllerBeforeViewController
 pageViewController:ViewControllerAfterViewController

无法正常工作,有时它会跳转到另一个页面,而不是下一个或上一个。如果我点击页面指示器 (UIPageControl),它只会在我使用滑动手势传递页面时才会发生。

我的代码:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
  NSUInteger index = ((DemoTourViewController*) viewController).pageIndex;

  if (index == NSNotFound)
    return nil;

  // If the current page is the first one then go back to the last one
  if (index == 0)
    index = [self.pageTitles count];

  index--;
  return [self viewControllerAtIndex:index];
 }

 - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
 {
  NSUInteger index = ((DemoTourViewController*) viewController).pageIndex;

  if (index == NSNotFound)
    return nil;

  index++;

  // If the current page is the last one then just start again (go in circle)
  if (index == [self.pageTitles count])
    index = 0;

  return [self viewControllerAtIndex:index];
}

我在我的日志上打印了索引值,它仅代表我被解释过,即索引为 2,滑动后为 4(应该为 3),但在设备中显示第三页和第三张图像但可以t 播放第三个视频,只再现第四个视频的声音。当我点击页面控制指示器时,不会发生这种情况。

编辑

我的 PageViewcontroller 中还有其他方法

- (DemoTourViewController *)viewControllerAtIndex:(NSUInteger)index
{
  if (([self.pageTitles count] == 0) || (index >= [self.pageTitles count])) {
    return nil;
  }

  // Create a new view controller and pass suitable data.
  DemoTourViewController *pageContentVC = [self.storyboard instantiateViewControllerWithIdentifier:@"DemoTourViewController"];
  pageContentVC.imageFile = self.pageImages[index];
  pageContentVC.titleText = self.pageTitles[index];
  pageContentVC.pageIndex = index;
  pageContentVC.videoPath = [[NSBundle mainBundle]pathForResource:self.pageVideos[index] ofType:@"mp4"];
  pageContentVC.backgroundImgView.userInteractionEnabled = YES;

  return pageContentVC;
}

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
{
  return [self.pageTitles count]; 
}

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
{
  return 0;
}

【问题讨论】:

  • 该代码没有明显的问题 - 您能否发布一些其他代码:viewControllerAtIndex: 方法,以及 pageTitles 的填充方式。谢谢。
  • 完成,希望你能帮助我 :) 谢谢@pbasdf
  • 那里也看不到任何东西; PresentationIndex 显然是不正确的,但我认为这是您的问题所附带的。
  • 谢谢@pbasdf,但我不知道如何解决。我遵循了一个教程来做这件事,显然我就是有这个问题的人
  • @pbasdf 应该返回什么presentationIndexForPageViewController:pageViewController??

标签: ios objective-c uipageviewcontroller


【解决方案1】:

好吧,我想了一夜之间,我认为你的问题来自于在 viewDidLoad 方法中开始播放电影。似乎当你使用滑动手势切换页面时,比如从第 2 页到第 3 页,pageViewController 不仅加载并显示第 3 页,它还抢先加载第 4 页。想必这是一个性能优化,所以如果你滑动再次快速它已经加载了下一页。但是,在您的情况下,这会触发索引 4 处的电影播放(您可以听到但看不到,因为该页面尚未显示)。由于一次只能播放一部电影,因此第 3 页上的电影会停止播放。

所以,为了解决这个问题,我会更改您的代码,以便电影只有在页面实际出现在屏幕上时才开始播放。我认为如果您将[self.player play] 移至viewDidAppear: 方法,它会正常工作。很高兴通过聊天会话回答任何问题。

【讨论】: