在子视图中添加UIViewController

我不知道这是否是搜索“在子视图中添加UIViewController”的正确关键。 正如你可以在我的图像中看到的那样,有两个ViewController,主控制器和第二个控制器。 在主控制器里面有一个UIView(蓝色背景色)。 在UIView中,我想在我的UIView中添加第二个ViewController。 我有这个代码,但它没有工作。

在这里输入图像描述

这是我的代码

#import "ViewController.h"
#import "SampleViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *testView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    SampleViewController * sample = [[SampleViewController alloc] initWithNibName:@"SampleViewController" bundle:nil];
    sample.view.frame = CGRectMake(0, 0, self.testView.bounds.size.width, self.testView.bounds.size.height);
    [self.testView addSubview:sample.view];
} 

@end

我想知道这是否可能? 我知道initWithNibName:在xib文件中工作,我没有确切的术语在谷歌搜索这个。 我只是想尝试一些东西,如果这可能在IOS中。 希望你明白我想要做什么。 希望得到您的建议。 提前致谢

这是我的更新

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *testView;
@property(strong,nonatomic) SampleViewController * samples;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

UIStoryboard *storyBoard = self.storyboard;
SampleViewController * sample = [storyBoard instantiateViewControllerWithIdentifier:@"SampleViewController"]; 
// SampleViewController * sample = [[SampleViewController alloc] //initWithNibName:@"SampleViewController" bundle:nil];

[self displayContentController:sample];
//commented the below line because it is not needed here, use it when you want to remove        
//child view from parent.
 //[self hideContentController:sample];

}

- (void) displayContentController: (UIViewController*) content;
{
    [self addChildViewController:content];                 // 1
    content.view.bounds = self.testView.bounds;                 //2
    [self.testView addSubview:content.view];
    [content didMoveToParentViewController:self];          // 3
}


- (void) hideContentController: (UIViewController*) content
{
    [content willMoveToParentViewController:nil];  // 1
    [content.view removeFromSuperview];            // 2
    [content removeFromParentViewController];      // 3
}

我总是得到这个错误

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/ace/Library/Developer/CoreSimulator/Devices/035D6DD6-B6A5-4213-9FCA-ECE06ED837EC/data/Containers/Bundle/Application/EB07DD14-A6FF-4CF5-A369-45D6DBD7C0ED/Addsubviewcontroller.app> (loaded)' with name 'SampleViewController''

我想,它寻找一个笔尖。 我没有在这里实现一个笔尖。


您应该使用Child遏制概念,这里MainViewController是父视图控制器,并且您希望将子视图控制器视图添加为主视图控制器上的子视图。

添加和删​​除一个孩子

//call displayContentController to add SampleViewCOntroller view to mainViewcontroller
 [self displayContentController:sampleVCObject];

// write this method in MainViewController
- (void) displayContentController: (UIViewController*) content;
{
   [self addChildViewController:content];                 // 1
   content.view.bounds = testView.bounds;                 //2
   [testView addSubview:content.view];
   [content didMoveToParentViewController:self];          // 3
}

以下是代码的作用:

它调用容器的addChildViewController:方法来添加子项。 调用addChildViewController:方法也会自动调用孩子的willMoveToParentViewController:方法。 它访问子视图属性来检索视图并将其添加到它自己的视图层次结构中。 容器在添加视图之前设置孩子的大小和位置; 容器总是选择孩子内容出现的地方。 虽然此示例通过明确设置框架来实现此目的,但您也可以使用布局约束来确定视图的位置。 它显式调用了孩子的didMoveToParentViewController:方法来表示操作已完成。

//you can also write this method in MainViewController to remove the child VC you added before.
- (void) hideContentController: (UIViewController*) content
{
   [content willMoveToParentViewController:nil];  // 1
   [content.view removeFromSuperview];            // 2
   [content removeFromParentViewController];      // 3
}

有关更多详细信息,请参阅apple文档:https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html

在Interface Builder中为不想编写代码的人配置容器。

要在设计时创建父子容器关系,请将容器视图对象添加到故事板场景中,如图5-3所示。 容器视图对象是一个代表子视图控制器内容的占位符对象。 使用该视图根据容器中的其他视图调整和定位孩子的根视图。

在Interface Builder中添加容器视图 当您使用一个或多个容器视图加载视图控制器时,Interface Builder还会加载与这些视图关联的子视图控制器。 孩子必须与父母同时实例化,以便可以创建适当的亲子关系。


只需使用StoryBoard即可完成此操作

  • 打开故事板并选择蓝色视图所在的视图控制器,打开Utilities搜索ContainerView并将其拖入蓝色视图,这会自动添加一个视图控制器,充当视图的子视图。 您可以在大小检查器中调整容器视图的大小。
  • 在这里输入图像描述


    我已经解决了关于第二个uiviewcontroller上的uview的问题。 按照我使用的代码:

        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    SecondViewController *sb = (SecondViewController *)[storyboard instantiateViewControllerWithIdentifier:@"sb"];
    
    sb.view.backgroundColor = [UIColor redColor];    
    [sb willMoveToParentViewController:self];
    
    [self.view addSubview:sb.view];
    
    [self addChildViewController:sb];
    [sb didMoveToParentViewController:self];
    

    我希望能帮助你。

    非常感谢

    链接地址: http://www.djcxy.com/p/15383.html

    上一篇: add UIViewController in subview

    下一篇: When to access subview properties in UIViewController Lifecycle?