ios - UIPageViewController 不跟踪页面索引

标签 ios objective-c uipageviewcontroller

我整个周末都在为这个问题苦苦挣扎,并且花了很长时间谷歌搜索来寻找解决方案,但没有成功。

我的用例非常简单,我不敢相信让这样一个微不足道的行为正常工作有多么困难。

我的应用程序是一个简单的分页流程,用户可以在其中向左或向右滑动以查看下一页或上一页。我有一个 UIPageViewController,每个页面都包含一个 UITableView。由于此处解释的原因,我在尝试跟踪 viewControllerAfterViewController 和 viewControllerBeforeViewController 函数中的页面索引时遇到了问题:PageViewController delegate functions called twice

我已经尝试遵循针对此问题的所有建议解决方法(跟踪 willTransitionToViewControllers 和 didFinishAnimating 中的索引)但这并不能解决我的问题,因为 viewController*ViewController 函数仍必须返回 viewController,因为它们最初是调用了两次,第一个返回的 viewController 似乎是被使用的那个,第二次通过似乎没有任何影响。

虽然我已经看到很多关于这个问题的问题和博客,但我还没有看到一个示例来说明如何从 viewController*ViewController 函数中始终如一地返回正确的 viewController,非常感谢您提供示例。我看不到解决方案的主要问题是,如果我只有一个内容在页面加载时动态更新的 viewController,如何确定 willTransitionToViewControllers 中的下一个索引。对我来说,这似乎是先有鸡还是先有蛋的问题;我需要弄清楚用什么内容来更新页面,但为此我需要知道页面的索引是什么(它是内容的一部分)。

编辑 以下是受影响代码的精简版:

- (void)viewDidLoad {
     [super viewDidLoad];

     _pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"];
     _pageViewController.dataSource = self;
     _pageViewController.delegate = self;
     [self.view addSubview:_pageViewController.view];

     PageContentViewController *startingPage = [self viewControllerAtIndex:0];

     NSArray *viewControllers = @[startingPage];
     [_pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
     // Don't do any index calculations as the result is inconsistent
     return [self viewControllerAtIndex:nextIndex];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
     // Don't do any index calculations as the result is inconsistent
     return [self viewControllerAtIndex:nextIndex];
}

- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers {
     // This value never changes because the global _pageViewContentController hasn't been updated yet
     nextIndex = [((PageContentViewController *)pendingViewControllers[0]) pageIndex];
}

- (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index {
     _pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"];
     _pageContentViewController.pageIndex = index;
     _pageContentViewController.title = index;

     return _pageContentViewController;
}

我已经调试了调用这些函数的顺序,并希望在页面转换后全局 _pageViewContentController 填充正确的数据。

编辑 2 详细说明我的问题;我的每个页面都包含一个标题和一个网络链接表。单击链接会打开 WebViewController 以显示所选网页。使用下面的 Yunus 解决方案,一切都正确显示(标题和链接按预期显示)但是当单击链接时会出现问题,因为这会从下一页加载链接。页面的渲染阶段似乎发生在数据正确的时候,但是在渲染完成后它会用不正确的数据重新初始化页面内容 Controller ,这就是实际链接数据错误的原因(即使渲染数据是好的).

最佳答案

让我们将所有相关的 contentViewController 保存在一个数组中

self.contentViewControllers = [NSMutableArray new];
for(int i=0; i< MAX_INDEX; i++) {
  [self.contentViewControllers addObject:[self viewControllerAtIndex:0]];
}

然后我们需要做的是决定我们应该在 after 和 before 方法上显示哪个 View Controller

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
  viewControllerBeforeViewController:(UIViewController *)viewController
{

  for(int i=0;i<self.contentViewControllers.count ;i++)
  {
    if(viewController == [self.contentViewControllers objectAtIndex:i])
    {
      if(i-1 >= 0)
      {
        return [self.contentViewControllers objectAtIndex:i-1];
      }
    }
  }
  return nil;
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
       viewControllerAfterViewController:(UIViewController *)viewController
{

  for(int i=0;i<self.contentViewControllers.count ;i++)
  {
    if(viewController == [self.contentViewControllers objectAtIndex:i])
    {
      if(i+1 < self.contentViewControllers.count)
      {
        return [self.contentViewControllers objectAtIndex:i+1];
      }
    }
  }
  return nil;
}

然后在transition方法中

- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers
{
  UIViewController* viewController = [pendingViewControllers objectAtIndex:0];
  NSInteger nextIndex = [self.contentViewControllers indexOfObject:viewController];
  [self.pageControl setCurrentPage:nextIndex];
}

关于ios - UIPageViewController 不跟踪页面索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32033888/

相关文章:

ios - Objective-C 标准化 iPhone 内置麦克风的 dB 电平

ios - 短网址的NSData无法使UIImage

ios - UIPageViewController:如何在页面顶部显示 UIPageControl

ios - UIPageViewController 和屏幕外方向更改

ios - uipageViewController 没有加载 y=0 的 View

ios - 为什么初始化这个 swift 对象会产生 2 而不是 1 的 ARC?

ios - 不要移动 UISwitch

javascript - 将本地文件传递给第三方框架

objective-c - 游戏中心 : authenticates ok, 显示排行榜正常,帖子(我的)得分正常,只有 2 个玩家?

ios - 如何更改 UIPageViewControllerOptionInterPageSpacingKey 的值?