根视图控制器的子视图控制器位于根之上

Posted

技术标签:

【中文标题】根视图控制器的子视图控制器位于根之上【英文标题】:Root View Controller's child View Controllers are on top of root 【发布时间】:2014-08-25 00:59:59 【问题描述】:

我有一个看似简单的问题,但我找不到解决方案!我有一个 UIViewController 的子类,它是我的根视图控制器,还有十个不同的 UIViewcontrollers,我想在调用时将它们作为子视图控制器加载(一次一个,而不是同时在屏幕上显示十个。)

根控制器有几个按钮,它们的动作调用相应的代码来调出子视图控制器。根视图控制器首先由 nib 加载,我想用 page01ViewController 作为第一个子项来实例化它。但是每当我调用以下代码时,子视图控制器就会覆盖在我的 rootViewController 之上,从而隐藏了我的根控制器中的所有控制按钮!

 //  RDJrootPageViewController.m

 #import "RDJrootPageViewController.h"
 #import "RDJhomeScreenViewController.h"
 #import "RDJpage01ViewController.h"
 #import "RDJpage02ViewController.h"
 #import "RDJpage03ViewController.h"
 #import "RDJpage04ViewController.h"
 #import "RDJpage05ViewController.h"
 #import "RDJpage06ViewController.h"
 #import "RDJpage07ViewController.h"
 #import "RDJpage08ViewController.h"
 #import "RDJpage09ViewController.h"
 #import "RDJpage10ViewController.h"

 @interface RDJrootPageViewController ()

 @property (retain, nonatomic) RDJhomeScreenViewController *homeScreenViewController;
 @property (retain, nonatomic) RDJpage01ViewController *page01ViewController;
 @property (retain, nonatomic) RDJpage02ViewController *page02ViewController;
 @property (retain, nonatomic) RDJpage03ViewController *page03ViewController;
 @property (retain, nonatomic) RDJpage04ViewController *page04ViewController;
 @property (retain, nonatomic) RDJpage05ViewController *page05ViewController;
 @property (retain, nonatomic) RDJpage06ViewController *page06ViewController;
 @property (retain, nonatomic) RDJpage07ViewController *page07ViewController;
 @property (retain, nonatomic) RDJpage08ViewController *page08ViewController;
 @property (retain, nonatomic) RDJpage09ViewController *page09ViewController;
 @property (retain, nonatomic) RDJpage10ViewController *page10ViewController;


 @end

 @implementation RDJrootPageViewController

 - (void)viewDidLoad
 
     [super viewDidLoad];
// Do any additional setup after loading the view.
currentPage = 1;

self.page01ViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"page01"];

[_page01ViewController.view setFrame:CGRectMake(0, 0, 1024, 768)];
[self addChildViewController:_page01ViewController];
[self.view addSubview:_page01ViewController.view];
[_page01ViewController didMoveToParentViewController:self];
[self.view setUserInteractionEnabled:YES];

 

我的问题与此处提出的问题类似,但从未找到解决方案:

Return from Child View Controller to Container

我找到的每个教程都有相同的设置:创建新的 VC,将其作为 childView 添加到 self,然后将其作为子视图添加到根视图,但它不起作用。

有人知道正确的做法吗?

【问题讨论】:

你想做什么?您将添加_page01ViewController 的视图作为当前视图的子视图。这就是它被覆盖的原因。 你好trick14。我希望我的“rootViewController”位于“page01ViewController”或选择的任何其他 pageController 之上。我假设这就是会发生的事情。 在我使用 rootViewController 将 pageXXViewController 添加为只是一个子视图而不是一个子视图之前,但这会导致问题,我发现它不是苹果推荐的,所以现在我正在尝试添加它们小时候。 【参考方案1】:

您可能想要用户 insertSubview:atIndex:。使用 0 的索引将在所有其他视图下添加视图。或者,您可以为页面视图控制器的视图创建一个容器视图。此容器视图需要添加到 RDJrootPageViewController 视图中的索引 0 处。页面视图控制器视图可以添加到上述容器视图中。

希望这会有所帮助。

【讨论】:

这实际上是我一直在做的。它可以工作,但是当我切换回该子视图时,屏幕右侧 1/4 处的用户交互被禁用。 切换回来是什么意思?您的代码也使用 addSubview: not insertSubview:atIndex: 正如我建议的那样。 哦,哎呀,我从教程中复制了它。我的意思是,如果 page01 被加载为子视图,然后您将子视图切换到 page02,然后再切换回 page01,那么只有 3/4 的屏幕检测到输入。我认为这是因为我正在制作的应用程序只是横向的,它不会旋转。

以上是关于根视图控制器的子视图控制器位于根之上的主要内容,如果未能解决你的问题,请参考以下文章

如何停止将 UIViewController 推到自身之上?

更改根视图控制器不会释放同一窗口上的先前视图控制器

动态设置拆分视图控制器为根视图控制器IOS

不是主/根视图时的 UINavigationController 用法

在展开的 segue 中弹出到根视图

UIViewController 遏制 - 新孩子不知道旋转