Ios UIPageViewController不跟踪页面索引

Ios UIPageViewController不跟踪页面索引,ios,objective-c,uipageviewcontroller,Ios,Objective C,Uipageviewcontroller,我整个周末都在努力解决这个问题,花了很长时间在谷歌上寻找解决方案,但没有成功 我的用例非常简单,我无法相信让这样一个琐碎的行为正常工作有多困难 我的应用程序是一个简单的分页流程,用户在其中向左或向右滑动以查看下一页或上一页。我有一个UIPageViewController,每个页面都包含一个UITableView。我在尝试跟踪viewControllerAfterViewController和ViewControllerBeforReviewController函数中的页面索引时遇到问题,原因如

我整个周末都在努力解决这个问题,花了很长时间在谷歌上寻找解决方案,但没有成功

我的用例非常简单,我无法相信让这样一个琐碎的行为正常工作有多困难

我的应用程序是一个简单的分页流程,用户在其中向左或向右滑动以查看下一页或上一页。我有一个UIPageViewController,每个页面都包含一个UITableView。我在尝试跟踪viewControllerAfterViewController和ViewControllerBeforReviewController函数中的页面索引时遇到问题,原因如下:

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

尽管我已经看到了很多关于这个问题的问题和博客,但我还没有看到一个示例来说明如何从viewController*viewController函数中一致地返回正确的viewController,我非常感谢您提供一个示例。我看不到解决方案的主要问题是,如果我只有一个viewController,其内容在页面加载时动态更新,那么如何确定WillTransitionOnViewController中的下一个索引。对我来说,这似乎是一个鸡和蛋的问题;我需要找出更新页面的内容,但要做到这一点,我需要知道页面的索引是什么(它是内容的一部分)

编辑 以下是受影响代码的摘要版本:

- (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
给我的问题更多的细节;我的每个页面都包含一个标题和一个web链接表。单击链接将打开WebViewController以显示所选网页。使用下面Yunus的解决方案,所有内容都能正确显示(标题和链接的显示与预期一致),但当点击链接时会出现问题,因为这会从下一页加载链接。页面的呈现阶段似乎发生在数据正确的点上,但在呈现完成后,它会使用不正确的数据重新初始化页面内容控制器,这就是实际链接数据错误的原因(即使呈现的数据良好)。

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

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

你能分享你代码的一些相关部分吗?@YunusErenGuzel-添加了代码片段。你如何打开这个WebViewController?在UIPageViewController内部或作为模态等等?哇-描述您的问题会让您以全新的眼光看待它,这真是太神奇了!我意识到我在页面内容视图控制器的viewDidLoad函数中初始化我的web链接。这导致渲染数据与控制器内的实际数据不同。我只是删除了那个初始化,现在一切都按预期进行。谢谢你在尤努斯周围提出的想法——它帮助我以一种不同的方式解决了这个问题。我很高兴你解决了你的问题;)嗨,尤努斯。谢谢你的帮助。我修改了我的代码以尝试您的建议(这是我在周末已经尝试过的,但没有成功)。在您的示例中,您正在设置nextIndex值,但它从未在任何地方使用。我是不是遗漏了什么?事实上,我把它留着给你,让你想怎么用就怎么用。我将它与SMPageControl一起使用,用
[self.pageControl setCurrentPage:nextIndex]保存索引可以使用此ViewController查看其工作方式。你的代码给了我同样的问题。调试时,事件的顺序如下:1。应用程序加载2。滑动到下一页3。调用viewControllerAfterViewController 4。调用ViewControllerBeforReviewController 5。将调用WillTransitionViewController 6。调用viewControllerAfterViewController 7。将显示下一页,但由于对viewController*ViewControllert的额外调用,数据不正确。这不是一个好的解决方案,因为您存储了所有viewControllers实例。UIPageViewController应在委托方法中对此进行管理。如果你有很多页面,这种方法是非常低效的。
- (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;
}
- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers
{
  UIViewController* viewController = [pendingViewControllers objectAtIndex:0];
  NSInteger nextIndex = [self.contentViewControllers indexOfObject:viewController];
  [self.pageControl setCurrentPage:nextIndex];
}