为啥我的页面控制器不能无限向后滚动?

Posted

技术标签:

【中文标题】为啥我的页面控制器不能无限向后滚动?【英文标题】:Why can't my page controller scroll infinitely backwards?为什么我的页面控制器不能无限向后滚动? 【发布时间】:2015-04-23 21:20:08 【问题描述】:

我创建了一个页面控制器,它具有三个可以无限向前滚动的视图控制器(例如:1 -> 2 -> 3 -> 1 -> 等)但是当我在第一个视图控制器上并尝试向后滚动时它进入白屏并且不能正确向后滚动?

我可以向后滚动,直到到达第一个视图控制器,但之后它只是白屏 (例如:3 -> 2 -> 1 -> 白屏)

我希望能够无限向后滚动,所以它看起来像这样 (例如:3 -> 2 -> 1 -> 3 -> 等等)

这是我的页面视图控制器的代码,我不知道我做错了什么?

有人可以帮我让我的页面视图控制器无限向后滚动吗?谢谢!

    #import "PageViewController.h"

@interface PageViewController ()

@end

@implementation PageViewController

    NSArray *myViewControllers;







- (void)viewDidLoad 
    [super viewDidLoad];

    self.delegate = self;
    self.dataSource = self;

    UIViewController *p1 = [self.storyboard
                            instantiateViewControllerWithIdentifier:@"ContentViewController1"];
    UIViewController *p2 = [self.storyboard
                            instantiateViewControllerWithIdentifier:@"ContentViewController2"];
    UIViewController *p3 = [self.storyboard
                            instantiateViewControllerWithIdentifier:@"ContentViewController3"];

    myViewControllers = @[p1,p2,p3];

    [self setViewControllers:@[p1]
                   direction:UIPageViewControllerNavigationDirectionForward
                    animated:NO completion:nil];




    NSLog(@"loaded!");






-(UIViewController *)viewControllerAtIndex:(NSUInteger)index

    return myViewControllers[index];




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

    NSUInteger currentIndex = [myViewControllers indexOfObject:viewController];

    --currentIndex;
    currentIndex = currentIndex % (myViewControllers.count);
    return [myViewControllers objectAtIndex:currentIndex];




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

    NSUInteger currentIndex = [myViewControllers indexOfObject:viewController];

    ++currentIndex;
    currentIndex = currentIndex % (myViewControllers.count);
    return [myViewControllers objectAtIndex:currentIndex];



-(NSInteger)presentationCountForPageViewController:
(UIPageViewController *)pageViewController

    return myViewControllers.count;


-(NSInteger)presentationIndexForPageViewController:
(UIPageViewController *)pageViewController

    return 0;



@end

【问题讨论】:

【参考方案1】:

在您的 viewControllerBeforeViewController 函数中,模运算符 % 不能满足您的要求。你的数字是这样的,% 不会让你回到你的第三个视图:

2、1、0、-1。

后退时,您必须检查是否已包装,然后明确转到最后一个。

【讨论】:

您好,感谢您的帮助,但我找不到有关“包装”或“显式”进入视图控制器的任何信息。是否可以详细说明并提供参考供我查看或一些示例代码?非常感谢您的帮助。 “换行”是指当您打算从第 1 页转到第 3 页时。您检测到您在第 1 页,现在需要转到最后一页。与其让模公式来完成工作,就像你前进的情况一样,你必须明确地处理这种情况。【参考方案2】:

感谢 Almo,我已经弄清楚并重写了 viewControllerBeforeViewController 的代码。

首先我设置 currentIndex,然后我检查显示的页面是第一个。

如果是那么我将当前页面设置为最后一页并返回它,

如果不是我运行我的旧方法来倒退,那么像往常一样返回它。

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

   NSUInteger currentIndex = [myViewControllers indexOfObject:viewController];

    if (currentIndex == 0) 
        currentIndex = 2;
    else
        --currentIndex;
        currentIndex = currentIndex % (myViewControllers.count);
    

    return [myViewControllers objectAtIndex:currentIndex];

【讨论】:

看这个,你的代码是多余的。您不再需要 % 操作,因为 if(currentIndex==0) 部分会处理它。就个人而言,我会做currentIndex--; if(currentIndex == -1) currentIndex = myViewControllers.count - 1;

以上是关于为啥我的页面控制器不能无限向后滚动?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我电脑的鼠标不受我控制,页面自动滚动的

如何处理 UIPageViewController 中的向后滚动?

移动端无限加载教程

iOS 双视图控制器在页面上一起滚动

为啥页面控制点从一页变为下一页

UIPageControl的无限UICollectionview