如何从任何其他视图控制器获取具有视图控制器详细信息的视图层次结构?

Posted

技术标签:

【中文标题】如何从任何其他视图控制器获取具有视图控制器详细信息的视图层次结构?【英文标题】:How to get view hierarchy with detail of a view controller from any other view controller? 【发布时间】:2016-08-12 04:40:47 【问题描述】:

我有一个 UIViewController 在运行时我以编程方式将视图添加到该视图控制器中。现在我想从任何其他视图控制器打印该视图控制器的视图层次结构。我想知道哪个确切的视图已添加。例如,如果我添加了这样的视图

UIView *main_view=[UiView alloc]initwithFrame:CGRectMake(20,20,34,80)];

然后我希望它打印该视图的确切名称。它只打印该视图的地址和框架详细信息。请建议我该怎么做?

【问题讨论】:

什么名字?视图没有名称。 当你想要一个“确切的名字”时,你必须“准确地”指定你的意思 就像我创建了一个 UIView main_view 的实例,那么它应该打印该实例名称 main_view main_view 是当前分配的内存的指针,所以你不能得到那个东西 为什么需要该名称,您可以将标签设置为您的视图并从层次结构中从标签中获取该视图并比较 if (self.main_view == foundView) 【参考方案1】:

你必须递归地迭代子视图。

- (void)listSubviewsOfView:(UIView *)view 

    // Get the subviews of the view
    NSArray *subviews = [view subviews];

    // Return if there are no subviews
    if ([subviews count] == 0) return; // COUNT CHECK LINE

    for (UIView *subview in subviews) 

        // Do what you want to do with the subview
        NSLog(@"%@", subview);

        // List the subviews of subview
        [self listSubviewsOfView:subview];
    

【讨论】:

【参考方案2】:
//You can set unique tag to each subview and then when you fetch view the compare view tag and if it match with the particule tag, that will be the view for which you are looking for.


UIView *main_view=[UiView alloc]initwithFrame:CGRectMake(20,20,34,80)];
main_view.tag = 1000;
[self.view addSubView:main_view];



// fetch view
UIView *view = [self.view viewWithTag:1000];
if ( view.tag == 1000 )
    NSLog("This is view - main_view");

【讨论】:

以上是关于如何从任何其他视图控制器获取具有视图控制器详细信息的视图层次结构?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过推送通知显示带有 TabBarController 导航的视图控制器

如何从主视图控制器在详细视图控制器中推送新视图?

如何从 segue 中的另一个视图控制器实例化导航和选项卡控制器(显示详细信息)?

我将如何使用相同的视图控制器,但通过它传递不同的信息?

如何从表视图控制器转到详细控制器并返回

从任何其他视图控制器移动到任何几个视图控制器