【问题标题】:Determine if UIViewController is inside Container View确定 UIViewController 是否在 Container View 内
【发布时间】:2014-06-17 06:13:39
【问题描述】:

是否可以检测 UIViewController 是否在容器视图内,例如以模态方式显示、是否在 UINavigationViewController 内等等?

编辑:澄清这个问题的原因:我有一个 VC,有时显示为表单,有时显示为另一个 VC 中的子 VC(在容器视图中)。我希望能够检查 VC 的实际显示方式(表单或容器视图)。

【问题讨论】:

  • 这里要小心,因为 UIViewController 只是协调 UIViews。从技术上讲,它不显示任何内容,也不真正包含在 UIView 中。您能否更具体地说明您要解决的问题?
  • 抽象地回答这个问题有点困难。在什么情况下你不知道它是否在容器视图中(毕竟你大概创建了故事板,并且会知道)?您能否更具体地说明您需要这些信息的原因?
  • 您的编辑本质上是在问同样的事情。您所指的“容器”视图实际上并不存在。它只被绘制在故事板中以帮助设计。所发生的只是“包含”视图控制器的view 被添加为属于“父”视图控制器的view 的子视图。您可以在代码中完成...[self.view addSubview:someViewController.view]; 这就是正在发生的一切。
  • 就像@dboals 说的。忘记包含视图控制器等...您要解决的问题是什么。你希望通过做这样的事情来实现什么功能。可能有更好的方法。
  • 编辑问题以解释问题的原因。

标签: ios uicontainerview


【解决方案1】:

在 Swift3 中,使用

if let parentVC = self.parent{ //no embeded
    if parentVC is UINavigationController //no embedded{
       ...
    } else {//embeded
       ...
    }
 } else {//presented
    ...
 }

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

如果 self.parent == nil,则显示。希望得到帮助。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      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 条件。
      • 不是这么简单的。如果控制器嵌入在任何类型的容器控制器中,则 parentViewController 属性将非零——包括所有 Apple 的罐头控制器,如 UINavigationController、UITabBarController 和 UISplitViewController。我不确定 OP 是否要求区分这些和自定义容器视图?如果是这样,您将必须查看 parentViewController 是否为非 nil,而不是任何 Apple 类。
      • @redelmar,是的,出于某种原因,我的眼睛只看到了模态这个词的问题,但是是的,他需要检查所有罐装 Apple 类型,或者如果他知道可能的 customViewController 类型,他可以与那些比较也很简单。这取决于他在做什么。
      • UIViewController 有一个名为 -navigationController 的方法!
      【解决方案4】:

      我写了一个小sn-p来显示一个视图的所有子视图,所以如果你传递一个顶级视图,你可以看到你的整个子视图树。将 @" " 传递给 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]];
      }
      

      }

      您可以使用类似的方法来检查您的容器视图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-08
        • 1970-01-01
        • 2019-03-11
        相关资源
        最近更新 更多