当前位置:  开发笔记 > 编程语言 > 正文

如何将UIViewController的视图添加为子视图

如何解决《如何将UIViewController的视图添加为子视图》经验,为你挑选了5个好方法。

请注意,对于googlers来说,这个QA已经过时了六年!

正如下面的Micky和其他人所提到的,现在每天都在iOS中使用Containers.


我有一个控制许多子视图的ViewController.当我单击其中一个按钮时,我初始化另一个视图控制器并将其视图显示为该视图的子视图.但是子视图超出了子视图框架的边界,并且实际上填满了整个屏幕.

可能有什么不对?我认为问题是UIViewController的视图有一个框架(0,0,320,460),因此填充整个屏幕(尽管只有在子视图边界内触摸时它才会接收到触摸事件).如何调整框架大小以适合子视图.

简而言之,我需要帮助将viewcontroller的视图作为子视图添加到另一个viewcontroller的视图中.

谢谢!



1> MickyD..:

从iOS 5开始,Apple现在允许您创建自定义容器,以便将UIViewController添加到另一个UIViewController,特别是通过addChildViewController等方法,因此确实可以嵌套UIViewControllers

编辑:包括就地摘要,以避免链接中断

我引用:

iOS提供了许多标准容器来帮助您整理应用程序.但是,有时您需要创建与任何系统容器提供的自定义工作流不匹配的自定义工作流.也许在您的愿景中,您的应用需要一个特定的子视图控制器组织,它们之间具有专门的导航手势或动画过渡.为此,您实现了一个自定义容器 - 告诉我更多...

...和:

设计容器时,可以在容器,父容器和其他视图控制器及其子容器之间创建显式的父子关系 - 告诉我更多

示例(Apple文档提供)将另一个视图控制器视图添加到容器的视图层次结构中

- (void) displayContentController: (UIViewController*) content
{
   [self addChildViewController:content];                 
   content.view.frame = [self frameForContentController]; 
   [self.view addSubview:self.currentClientView];
   [content didMoveToParentViewController:self];          
}

干杯,

Micky Duncan


`currentClientView`的作用是什么?我在文档中根本无法理解它.
在此答案的顶部添加了评论.

2> Naloiko Euge..:

感谢这些家伙我做到了http://highoncoding.com/Articles/848_Creating_iPad_Dashboard_Using_UIViewController_Containment.aspx

添加UIView,将其连接到标头:

@property (weak, nonatomic) IBOutlet UIView *addViewToAddPlot;

在 - (void)viewDidLoad执行此操作:

ViewControllerToAdd *nonSystemsController = [[ViewControllerToAdd alloc] initWithNibName:@"ViewControllerToAdd" bundle:nil];
    nonSystemsController.view.frame = self.addViewToAddPlot.bounds;
    [self.addViewToAddPlot addSubview:nonSystemsController.view];
    [self addChildViewController:nonSystemsController];
    [nonSystemsController didMoveToParentViewController:self];

请享用


文档说明应该在addChildViewController之后调用didMoveToParentViewController,而不是之前.

3> Steven Fishe..:

这个答案对于旧版本的iOS是正确的,但现在已经过时了.您应该使用Micky Duncan的答案,其中包括自定义容器.

不要这样做!这样做的目的UIViewController是驱动整个屏幕.它只是不适合它,它并没有真正添加你需要的任何东西.

您所需要的只是拥有自定义视图的对象.只需使用UIView自身的子类,就可以将其添加到窗口层次结构中,内存管理是完全自动的.

将子视图NIB的所有者指向自定义子类UIView.contentView向此自定义子类添加插座,并将其指向nib中的视图.在自定义子类中执行以下操作:

- (id)initWithFrame: (CGRect)inFrame;
{
    if ( (self = [super initWithFrame: inFrame]) ) {
        [[NSBundle mainBundle] loadNibNamed: @"NibNameHere"
                                      owner: self
                                    options: nil];
        contentView.size = inFrame.size;
        // do extra loading here
        [self addSubview: contentView];
    }
    return self;
}

- (void)dealloc;
{
    self.contentView = nil;
    // additional release here
    [super dealloc];
}

(我假设你在这里initWithFrame:用来构建子视图.)


虽然当时非常好的答案,这可能是自iOS 5以来的过时哲学.请参阅下面的答案

4> Logan..:

我觉得所有这些答案都略有不完整,所以这里是将viewController的视图添加为另一个viewController视图的子视图的正确方法:

    [self addChildViewController:viewControllerToAdd];
    [self.view addSubview:viewControllerToAdd.view];
    [viewControllerToAdd didMoveToParentViewController:self];

如果您愿意,可以将其作为代码段复制到您的代码中.所以似乎不理解代码替换格式,但它们将在Xcode中显示清晰:

    [self addChildViewController:<#viewControllerToAdd#>];
    [self.view addSubview:<#viewControllerToAdd#>.view];
    [<#viewControllerToAdd#> didMoveToParentViewController:self];

将使用 addChild自动调用willMove.谢谢@iOSSergey

当您的自定义容器调用addChildViewController:方法时,它会自动调用视图控制器的willMoveToParentViewController:方法作为子项添加,然后再添加它.



5> 小智..:

使用:

[self.view addSubview:obj.view];

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有