UIPageViewController 向后滑动未显示最后一个 ViewController。它再次重新加载

Posted

技术标签:

【中文标题】UIPageViewController 向后滑动未显示最后一个 ViewController。它再次重新加载【英文标题】:UIPageViewController back swipe is not showing last ViewController. It reloads again 【发布时间】:2014-08-01 10:19:08 【问题描述】:

我正在研究 UIPageViewController,我是这个概念的新手。我的要求是这样的,

我有四种布局,分别称为 L1、L2、L3 和 L4。所有的布局设计都是在同一个视图控制器中完成的,称为 JLayoutOneVc 我的功能就像杂志,所以向右/向前滑动我们看到新文章,在左/向后滑动我看到最后加载的文章。

在向右/向前滑动时,我会调用 API,它会为我提供数据,根据这些数据我决定要显示哪种布局 向右/向前滑动可以正常工作,并且可以完美显示数据,但向左/向后滑动不会显示最后加载的屏幕。

我的代码

// load previous Article
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
    if ([self.cachedLayouts count] > 0) 
        JLayoutOneVC *prev = (JLayoutOneVC *)[self.cachedLayouts lastObject];
        //[prev setArticleDetailsRespDict:self.articleDetailsRespDict];
        pageCount -= 1;
        return prev;
    

    JLayoutOneVC *prev = [self.storyboard instantiateViewControllerWithIdentifier:@"LayoutOneId"];
    [prev setArticleDetailsRespDict:self.articleDetailsRespDict];
    prev.articleDetailsRespDict = nil;
    [prev.articleDetailsTable reloadData];
    pageCount -= 1;
    return prev;


// load next Article
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
    JLayoutOneVC *next = (JLayoutOneVC *)[self.storyboard instantiateViewControllerWithIdentifier:@"LayoutOneId"];
    [next setArticleDetailsRespDict:self.articleDetailsRespDict];
    next.articleDetailsRespDict = nil;
    [next.articleDetailsTable reloadData];
    pageCount += 1;
    return next;


- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers

    if([pendingViewControllers count]>0)
    
        // Doing this for testing purpose
        if (self.layout > 4) 
            self.layout = 1;
         else 
            self.layout += 1;
        
        [self performSelector:@selector(getArticleDetailsFromServer:) withObject:nil afterDelay:1.0f];
    


我正在添加图片作为参考。

将此视为我的第一篇文章。

向右/向前滑动我看到了

这是第二篇文章。

现在,当我向后/向左滑动时,这就是我面临的问题。它不会加载最后一个 ViewController,而是显示新数据。

希望你们能帮助我。提前致谢。请在下面我的问题评论中提出任何疑问。

【问题讨论】:

【参考方案1】:

我不知道你为什么要检查

if ([self.cachedLayouts count] > 0) 

您的验证应基于 pageCount:

-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
    if (pageCount > 0) 
        pageCount -= 1;
        JLayoutOneVC *prev = [self.storyboard instantiateViewControllerWithIdentifier:@"LayoutOneId"];
        // I'm not sure how setArticleDetailsRespDict get the data, the best way would be get the data base on index, in this example pageCount
        [prev setArticleDetailsRespDict:self.articleDetailsRespDict];
        prev.articleDetailsRespDict = nil;
        [prev.articleDetailsTable reloadData];

        return prev;
    

另一个方法viewControllerAfterViewController: 也应该检查pageCount 值:

if (pageCount < MAXPAGECOUNT) 

最好的方法是添加到自定义视图控制器 (JLayoutOneVC) 属性,例如 index,在这两种方法中,您都可以获取该值并增加/减少它(取决于方法)。之后,您可以获取该索引上的数据库并重新加载视图。

【讨论】:

嘿,格雷格,我已经做出了您建议的更改,但仍然没有运气。作为参考,你可以试试这个应用程序。我需要刷类似这个应用的文章itunes.apple.com/in/app/the-times-of-india/id427589329?mt=8 我认为问题在于您的数据,即 setArticleDetailsRespDict: 方法的工作方式。您能否在每次更改页面时记录您的数据并查看它是否返回正确的值。如果你能展示这种方法,那将会有所帮助。您还设置了该 dict: setArticleDetailsRespDict ,然后设置 nil: prev.articleDetailsRespDict 并重新加载数据。所以我相信你用 nil 字典重新加载数据。

以上是关于UIPageViewController 向后滑动未显示最后一个 ViewController。它再次重新加载的主要内容,如果未能解决你的问题,请参考以下文章

2 UIPageViewController 手势冲突

创建一个无限循环的 UIPageViewController

如何使用按钮在 UIPageViewController 中向前和向后导航?

如何快速阻止 UIPageViewController 的滑动手势?

滑动时停止滚动 UIPageViewController

UIPageViewController 动画表示可以滑动