将子视图添加到视图控制器

Posted

技术标签:

【中文标题】将子视图添加到视图控制器【英文标题】:Adding subViews to a viewcontroller 【发布时间】:2012-06-05 22:21:15 【问题描述】:

我在尝试将视图控制器作为子视图加载到另一个视图控制器时遇到问题。

我拥有的是一个 NavigationController,它可以将一些 viewControllers 加载为可以完美运行的视图(pop 和 push 等)。然后我决定将 tabBar 放入 viewController 中,然后使用 switch 语句查看所有选择内容,然后此 switch 语句调用出现在 navigationController 中的 viewController 中的一个方法。 这个 viewController 内部的方法然后尝试将另一个 viewcontroller 设置为导航控制器内部 viewcontroller 的子视图。

这是我的代码。

TabBarViewController.m

#import "DetailViewController.h"

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item

    switch (item.tag) 
        case 0:
        
             NSLog(@"item 1 selected");
            DetailViewController *dVC = [[DetailViewController alloc] init];
            [dVC tabBarSelectedAction];
        
            break;
        default:
            break;
    


所以这会捕获选项卡栏上的选定项目...然后向 DetailViewController 方法触发一条消息,以将新的子视图加载到 DetailViewController.view 上

- (void)tabBarSelectedAction

    ButtonOneViewController *b1VC = [[ButtonOneViewController alloc] initWithNibName:@"ButtonOneViewController" bundle:[NSBundle mainBundle]];
    [self.testView addSubview:b1VC.view];


这就是我试图将子视图加载到屏幕上的地方。我认为我做得对,但由于某种原因它没有显示。我想做的另一件事是从底部动画这个视图屏幕向上..

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

当您创建新的DetailViewController 时,您并没有通过 push 或 present 类型的方法使其成为视图层次结构的一部分。添加子视图可能有效也可能无效,但您不会看到它,因为您添加它的对象没有使用屏幕。

【讨论】:

哦,对了..所以我不妨将这个新的子视图添加到导航控制器中..这是视图层次结构的一部分吗?【参考方案2】:

你的方法应该是这样的。假设自己是DetailViewController

- (void)tabBarSelectedAction 

   ButtonOneViewController *b1VC = [[ButtonOneViewController alloc] initWithNibName:@"ButtonOneViewController" bundle:[NSBundle mainBundle]];
   [self presentModalViewController:b1VC animated:YES];

即便如此,我认为你的逻辑有点搞砸了。您分配并初始化DetailViewController,但您从未在任何地方呈现它。那么,如果您从不展示它,您希望如何在 DetailViewController 中看到模态视图。

编辑:考虑到您将其添加到UINavigationController 的评论,您可以将其更改为如下所示..

  [[self navigationController] presentModalViewController:b1VC animated:YES];

EDIT2:另外,您正在初始化一个类,只是为了调用一个已经是self 的方法。你的-didSelectItem: 方法应该看起来更像这样。

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item 
switch (item.tag) 
    case 0:
    
         NSLog(@"item 1 selected");
        [self tabBarSelectedAction];
    
        break;
    default:
        break;
    


【讨论】:

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

将子视图添加到视图控制器时,ScrollView 不滚动

如何将子视图添加到另一个视图控制器?

如何将子 ViewController 的视图添加到父 View 控制器的子视图中?

如何在保留选项卡栏的同时将子视图控制器添加到选项卡式视图控制器?

addChildViewController 方法仅用于将子视图控制器添加到 containerViewController?

必须使用延迟实例化的UI视图将子视图添加到视图控制器两次