UIPageViewController 将先前的 ViewController 保持在视图的背景上

Posted

技术标签:

【中文标题】UIPageViewController 将先前的 ViewController 保持在视图的背景上【英文标题】:UIPageViewController keeping previous ViewController on the Background of the view 【发布时间】:2015-02-28 17:57:55 【问题描述】:

我有一个 UIPageViewController,我以编程方式启动它,我已经覆盖了 viewControllerBeforeViewControllerviewControllerAfterViewController 方法,以便在每次翻转后动态创建视图控制器。问题是当我没有完成翻页移动并且前一个视图控制器返回视图时,相同的视图控制器仍保留在视图的背景上,从而弄乱了我正在显示的内容。我尝试使用 UIPageViewController 委托 pageViewController didFinishAnimating 的回调方法,在这个方法中,我得到了我想要得到的消息,所以当动画没有完成时,我可以对它做出反应,但是当我通过设置其当前视图控制器刷新 UIPageViewController 时,问题仍然存在,这里是代码:

  (void)pageViewController:(UIPageViewController *)pageViewController
        didFinishAnimating:(BOOL)finished
   previousViewControllers:(NSArray *)previousViewControllers
       transitionCompleted:(BOOL)completed 
  if (!completed)
  
    [self viewDidAppear:NO];
    for (UIViewController* vc in previousViewControllers) 
        [self setViewControllers: @[vc]
                       direction: UIPageViewControllerNavigationDirectionForward
                        animated: NO
                      completion: nil];
    
    return;
   

  

问题是:我怎样才能“清理”或“刷新”或“清除”我的 UIPageViewController 的内容以删除剩余视图并仅显示预期的视图。

【问题讨论】:

【参考方案1】:

我有/遇到过类似的问题。我使用一个 UIPageViewController,它可以根据帐户(可切换)加载不同的 PageContentView。我正在使用以下代码删除在某种程度上有效的现有 PageContent:

[[self.pageViewController.childViewControllers objectAtIndex:0] willMoveToParentViewController:nil];
[[self.pageViewController.childViewControllers objectAtIndex:0].view removeFromSuperview];
[[self.pageViewController.childViewControllers objectAtIndex:0] removeFromParentViewController];

但是当我滑动到不是第一个屏幕的屏幕,然后更改 UIPageViewController/PageContentView 时,我可以看到新内容后面的现有内容。

我仔细研究了一下,发现在 UIViewController 的子视图中有一个名为 _UIPageViewControllerContentView 的对象。

所以我写了这段代码来删除它,它似乎有帮助。

for (id obj in self.view.subviews) 
    if ([[NSString stringWithFormat:@"%@", [obj class] ] isEqualToString:@"_UIPageViewControllerContentView"]) 
        [obj removeFromSuperview];
    

希望这会有所帮助。

【讨论】:

以上是关于UIPageViewController 将先前的 ViewController 保持在视图的背景上的主要内容,如果未能解决你的问题,请参考以下文章

将页面控件设置到 UIPageViewController 的顶部

以编程方式将 UIPageViewController 过渡样式设置为滚动

将 UINavigationController 添加到 UIPageViewController

如何将数据从 UIPageViewController 传递到它的“子视图”之一?

将 UIPageViewController 的逻辑实现为 Swift 中 UIViewController 的子视图

将删除滑动手势从 UIPageViewController 传递给 UITableView