gpt4 book ai didi

ios - UIPageViewController 不跟踪页面索引

转载 作者:可可西里 更新时间:2023-11-01 03:56:47 25 4
gpt4 key购买 nike

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

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

我的应用程序是一个简单的分页流程,用户可以在其中向左或向右滑动以查看下一页或上一页。我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com