刷新一个 UIPageViewController

Posted

技术标签:

【中文标题】刷新一个 UIPageViewController【英文标题】:Refresh a UIPageViewController 【发布时间】:2013-11-21 12:26:49 【问题描述】:

我有一个 UIPageViewController<UIPageViewControllerDataSource> 代表)管理 3 个 UIViewController。 要从第二个视图转到第三个,我必须点击一个按钮,否则第二个视图是最后一个可见页面。进入第 3 页后,用户应该能够滑动以返回 2,但不能滑动以返回 3(始终需要该按钮才能返回第 3 页)。 这是代码的一部分:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
    UIViewController *prevViewController = nil;
    if (viewController == self.P2ViewController) 
        prevViewController = self.P1ViewController;
    
    if (viewController == self.P3ViewController) 
        [self pageViewController:pageViewController viewControllerAfterViewController:self.P2ViewController]; /*this doesn't work*/
        prevViewController = self.P2ViewController;
    
    return prevViewController;

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
    UIViewController *nextViewController = nil;
    if (viewController == self.P1ViewController) 
        nextViewController = self.P2ViewController;
    
    if (viewController == self.P2ViewController) 
        nextViewController = nil;
    
    return nextViewController;

然后我有一个自定义的UIViewController 类,其中我有一个 IBAction,并且我通过一个静态变量和一个通知传递了正确的 UIViewController。部分代码:

-(IBAction)goToPage:(NSNotification *)notification
    /*some code*/
    [((UIPageViewController *)self.parentViewController) setViewControllers:viewControllersArray direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];

我第一次从第 1 页转到第 2 页时,第二页是最后一页。然后我点击按钮,然后我正确地进入动画的第三页(UIPageViewController 中的“动画错误”对我很有用)。然后第三个视图是最后一个,我可以返回到第二个视图,但是当我返回时没有调用 viewControllerAfterViewController: 方法,我仍然可以转到第三页。

相反,我想返回第二页,将第二页作为最后一页,每次返回时从缓存中删除第三页。 我已经在第二页的自定义 UIViewController 类中尝试使用此代码:

-(void)viewWillAppear:(BOOL)animated
    [((UIPageViewController *)self.parentViewController) setViewControllers:@[myStaticViewController2] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

但它仅在我第二次尝试从该页面前后移动时才有效。像我一样在viewControllerBeforeViewController 中再次调用viewControllerAfterViewController 也是没用的。 我希望我很清楚,我找不到这个问题的解决方案。

提前致谢

【问题讨论】:

创建一个小型演示项目并将其上传,这样人们就可以按照您的意愿尝试使其工作。 我创建了一个演示项目:This is the link。我希望这个主机能正常工作 【参考方案1】:

好的 - 我想我找到了让它工作的方法。

把它放在PageViewController中,并在.h文件中添加一个声明:

// a button press is causing a move
- (void)moveToThirdController

    __weak PageViewController *pc = self;
    [self setViewControllers:@[self.P3ViewController] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:^(BOOL ret)
        
            // second dispatch may be overkill
            dispatch_async(dispatch_get_main_queue(), ^
                
                    // it seems setting no wipes the cache
                    [pc setViewControllers:@[pc.P3ViewController] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
                 );
         ];

在你的第二个视图控制器中,我稍微修改了你在那里的内容:

- (void)viewDidAppear:(BOOL)animated

    [super viewDidAppear:animated];

    __weak P2ViewController *pc = self;
    dispatch_async(dispatch_get_main_queue(), ^
        
            [((UIPageViewController *)self.parentViewController) setViewControllers:@[pc] direction:UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];
         );

关键是不断尝试让 pageViewController 通过第二次调用来删除其缓存,其中动画为 NO。

事实证明这是首次发布的解决方案here的变体

【讨论】:

也许我不清楚:我不希望从 page2 向前滑动访问 page3,除非点击该页面上的按钮。然后,回到 page2,我希望 page3 从“UIPageViewController 缓存”中删除。 告诉你什么 - 你让问题更清楚,我会修改代码来做你想做的事。 非常感谢,对不起,我的英语很差。但是,一种解决方案可能是第三个UIViewController page3 自定义类和viewDidDisappear 自定义setViewControllers:direction:animated:completion:,但在这种情况下,它不适用于 3 页以上的应用程序(移动到第 4 页它会返回到第二个),我确实有很多页面。 谢谢!谢谢!我试图了解它是如何工作的。我看到 __weak 属性和 dispatch_asyncprevent viewDidAppear 进入循环,这是我正在寻找的刷新!所以我试图删除-(void)moveToThirdController...,因为我已经有一个IBAction,事实上它确实有效。然而这是真的,这是一种类似于UIPageViewController 错误的情况。太好了,非常感谢! 良好的设计实践是将页面控制器的内部使用方式包含在该类中,并公开“驱动”它的方法。即使是在 viewController2 中完成的代码也应该是那里的一个方法。两年后,如果 UIPageController 发生变化,如果代码散布在所有类中,你将如何弄清楚你做了什么。无论如何我都会这样做,因为多年后我不得不查看我的旧代码并试图弄清楚我想要做什么......

以上是关于刷新一个 UIPageViewController的主要内容,如果未能解决你的问题,请参考以下文章

uipageviewcontroller 中的 Swift uipageviewcontroller

UIPageViewController 和 UIScrollView

以编程方式平滑滚动 UIPageViewController

UIPageViewController - 到下一个视图控制器的动画过渡与方向变化混合

UIPageViewController 带有最后一个视图,没有页面指示器

如何跳回 UIPageviewController 中页面的第一个索引