【问题标题】:UIPageViewController back swipe is not showing last ViewController. It reloads againUIPageViewController 向后滑动未显示最后一个 ViewController。它再次重新加载
【发布时间】: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,而是显示新数据。

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

【问题讨论】:

    标签: objective-c xcode ios7 uiviewcontroller uipageviewcontroller


    【解决方案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 字典重新加载数据。
    猜你喜欢
    • 1970-01-01
    • 2018-01-12
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多