判断UIViewController是否在容器视图内

4

是否可以检测一个UIViewController是否在容器视图中,而不是以模态显示,或者位于UINavigationViewController中等等?

编辑:为了澄清这个问题的原因:我有一个VC,有时显示为Form Sheet,有时作为另一个VC的子VC显示在其内部(在Container View中)。我想能够检查VC实际上是如何显示的(Form Sheet还是在Container View中)。


在这里要小心,因为UIViewController仅仅协调UIView。从技术上讲,它不显示任何内容,也不真正包含在UIView中。您能否更具体地说明您要解决的问题? - dboals
这个问题有点抽象,很难回答。在什么情况下您不知道它是否在容器视图中(毕竟您应该创建了故事板,并且应该知道)?您能否更具体地说明为什么需要这些信息? - rdelmar
你的编辑实质上是在问同样的问题。你所提到的“容器”视图并不存在,它只是在storyboard中被绘制出来以便设计。实际发生的事情是,“包含”的视图控制器的view被添加为“父级”视图控制器的view的子视图。你可以通过代码实现... [self.view addSubview:someViewController.view]; 这就是所有的操作。 - Fogmeister
就像@dboals所说的那样。不要考虑包含视图控制器等等...你试图解决的问题是什么?通过这样做,你希望实现什么功能?可能有更好的方法来解决它。 - Fogmeister
编辑了问题以解释提出问题的原因。 - Jorn
4个回答

4
parentViewController property is set only if you are inside a container view. 

请参见以下链接:

https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/parentViewController

编辑:

要检查类型,请按照以下方式操作。

UIViewController * parentController = self.parentViewController;
if (parentController != nil && [parentController isKindOfClass:[UINavigationController class]])
{
    // code
}

您不需要parentController != nil的条件。 - Droppy
3
这并不是那么简单。如果控制器嵌入了任何类型的容器控制器,包括所有苹果预设的控制器(如UINavigationController、UITabBarController和UISplitViewController),parentViewController属性将不为nil。我不确定OP是否想区分这些预设控制器和自定义容器视图?如果是这样,你需要检查parentViewController是否为非nil值,并且不是上述任何一种苹果类别。 - rdelmar
@redelmar,是的,由于某种原因,我的眼睛只看到了问题中“modally”这个词,但是是的,他需要检查所有罐装的苹果类型,或者如果他知道可能的 customViewController 类型,他也可以简单地与之比较。这取决于他在做什么。 - dboals
UIViewController有一个名为-navigationController的方法! - Michael

1
在Swift3中,使用
if let parentVC = self.parent{ //no embeded
    if parentVC is UINavigationController //no embedded{
       ...
    } else {//embeded
       ...
    }
 } else {//presented
    ...
 }

从导航栏显示当前视图控制器;否则由父视图控制器嵌入(例如,一个带有一个UITableViewController的视图嵌入的ViewController)。

如果self.parent == nil,则它被呈现。希望能帮到您。


0
我写了一个小片段,可以显示一个视图的所有子视图。如果你传递一个顶层视图,你就可以看到整个子视图树。传递 @" " 到 Indent 可以使子树缩进一点,然后从调试器控制台复制它并粘贴到像 Bbedit 这样的文本编辑器中。
- (void) viewAllSubviews:(UIView *) topView Indent:(NSString *) indent  {
for (UIView * theView in [topView subviews]){
    NSLog(@"%@%@", indent, theView);
    if ([theView subviews] != nil)
        [self viewAllSubviews:theView Indent: [NSString stringWithFormat:@"%@ ",indent]];
}

}

您可以使用类似以下代码来检查您的容器视图。

0

UIViewController有一个属性navigationController和一个属性tabBarController。查看UIVIewController reference

if(self.navigationController) {
    //you are inside a navigation controller
}

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