我不知道这是否是搜索“在 subview 中添加UIViewController”的正确键。
正如您在我的图像中看到的那样,有两个ViewController,即主 Controller 和第二个 Controller 。在主 Controller 内部有一个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文件中使用,我不知道要在Google中搜索此字词的确切字词。我只是想尝试一些东西,如果这可以在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''

我认为,它正在寻找 Nib 。我没有在这里实现 Nib 。

最佳答案

您应该使用子级包含概念,这里MainViewController是父级 View Controller ,并且您想要将子级 View Controller View 添加为Main View Controller上的 subview 。

添加和删除子

//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:方法。
它访问子级的view属性以检索 View 并将其添加到其自己的 View 层次结构中。容器会在添加 View 之前设置 child 的大小和位置;容器始终选择显示 child 内容的位置。尽管此示例通过显式设置框架来完成此操作,但是您也可以使用布局约束来确定 View 的位置。
它显式调用子级的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 doc:
https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html

在那些不想编写代码的人中,在Interface Builder中配置一个容器。

要在设计时创建父子容器关系,请将一个容器 View 对象添加到 Storyboard 场景中,如图5-3所示。容器 View 对象是一个占位符对象,代表 subview Controller 的内容。使用该 View 调整子级根 View 的大小和位置,使其相对于容器中的其他 View 。

ios - 在 subview 中添加UIViewController-LMLPHP
当使用一个或多个容器 View 加载 View Controller 时,Interface Builder还将加载与那些 View 关联的 subview Controller 。子代必须与父代同时实例化,以便可以创建适当的父子关系。

10-08 05:56
查看更多