从父视图控制器中隐藏或临时删除子视图控制器?

3
(因为在谷歌上找不到结果,但我最终通过试错找到了解决方法,所以提出问题并自己回答)iOS5和6中,苹果公司添加了一些丑陋的技巧来支持InterfaceBuilder的“嵌入式”视图控制器。他们没有详细说明如何工作,只是给出了代码级别的示例,并且只涵盖了有限的情况。特别是,我想要一个嵌入的视图控制器,有时是隐藏的 - 但如果你尝试显而易见的方法,它不起作用(会留下一个白色矩形)。
childViewController.view.hidden = TRUE;
4个回答

5
为什么不直接创建一个IBOutlet到你的容器视图,然后这样做?
self.containerView.hidden = YES;

3
他们是通过一种变体方式实现的,这种方式自iOS 2以来就已经存在(但仅支持视图而不支持视图控制器)——真正的、真实的UIView被嵌入到父视图中(源代码示例中未提及,只有在使用InterfaceBuilder时才会添加!)。
因此,如果您执行以下操作:
childViewController.view.superview.hidden = TRUE;

...它能用!

另外,令人费解的是,您可以从viewDidLoad开始的任何时候调用此方法 - Apple的“嵌入式segue”hack在调用viewDidLoad之前执行。

因此,您可以在启动时执行此操作,使您的childViewController最初不可见。


这并不是什么大发现。如果你添加一个容器视图并查看它的类,你会发现它只是一个UIView,就像任何其他的UIView一样,它有一个默认的白色背景颜色。 - rdelmar
苹果的文档描述与此不同。它们没有提到“额外”的UIView。它们也没有记录“嵌入式segue”(据我从谷歌搜索中了解,它只出现在WWDC视频中)。任何未记录的内容都会让我感到惊讶 :) - Adam
我认为,关于这方面的文档确实是少之又少,我同意。 - rdelmar
如果您通过IB添加视图控制器,则实际上会看到嵌入式segue。 - JonahGabriel
@Jonah.at.GoDaddy 是的,您看到了segue。但它与普通Segue不同(它在viewDidLoad之前启动!)。它需要一个containerview吗?Containerview只有在Xcode/NIB中才需要吗? :( - Adam
你帮我省去了很多工作,因为我不需要再添加或删除我的嵌入式视图控制器来隐藏/显示它们。谢谢! - Lensflare

3
使用这个代码:[self.childviewController setHidden:YES];

文档中说没有"self.containerView"这样的东西。你从哪里得到的这个信息? - Adam
childViewController 不是 containerView。 - iosLearner

0

在某些情况下,如果有人需要隐藏/显示所有子视图或迭代它们:

func hideChildrenViews() {
    for view in self.view.subviews {
        (view as! UIView).hidden = true
    }
}

func showChildViews() {
    for view in self.view.subviews {
        (view as! UIView).hidden = false
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接