当前位置: 首页 > 知识库问答 >
问题:

在子视图中添加UIViewController

狄鹏
2023-03-14

我不知道这是否是搜索“在子视图中添加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文件中工作,我不知道在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。

共有3个答案

井嘉胜
2023-03-14

我已经解决了第二个uiviewcontroller上的uiview问题。按照我使用的代码进行操作:

    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];

我希望能帮助你。

非常感谢

卜鹏
2023-03-14

你可以简单地通过使用StoryBoards来做到这一点

  • 打开序列图像板并选择蓝色视图所在的视图控制器,打开实用程序搜索ContainerView并将其拖动到蓝色视图中,这将自动添加一个视图控制器,作为视图的子视图。可以在“大小检查器”中调整容器视图的大小
刁瀚昂
2023-03-14

您应该使用子包含概念,在这里,主视图控制器是父视图控制器,您希望将子视图控制器视图添加为主视图控制器上的子视图。

添加和删除子元素

//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:方法还会自动调用孩子的will MoveTo为人父母tViewController:方法。它访问子视图属性以检索视图,并将其添加到自己的视图层次结构中。容器在添加视图之前设置子对象的大小和位置;容器总是选择子对象的内容出现的位置。虽然本示例通过显式设置框架来实现这一点,但您也可以使用布局约束来确定视图的位置。它显式地调用子级的didMoveTo为人父母tViewController:方法来表示操作已完成。

//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
}

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

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

要在设计时创建父子容器关系,请将容器视图对象添加到情节提要场景中,如图5-3所示。容器视图对象是表示子视图控制器内容的占位符对象。使用该视图可以相对于容器中的其他视图调整子级根视图的大小和位置。

 类似资料:
  • 若要添加一个新的视图,点击工具栏的 按钮,并点击画布的任意位置。你可以从浏览器的模型选项卡添加一个现有的视图,简单地从模型选项卡拖放视图到画布。 【注意】如果你右击视图连接器,你可以选择添加或删除顶点,以及更改它的颜色,或者前往源视图和目标表。 在画布中视图对象的弹出式菜单选项包括: 选项 描述 设计视图 在视图设计器中编辑视图结构。设计器内的选项卡和选项是根据你所选择的图表数据库类型而有所不同。

  • 若要添加一个新的视图,点击工具栏的 按钮,并点击画布的任意位置。你可以从浏览器的模型选项卡添加一个现有的视图,简单地从模型选项卡拖放视图到画布。 【注意】如果你按住 Control 键并点按视图连接器,你可以选择添加或删除顶点,以及更改它的颜色,或者前往源视图和目标表。 在画布中视图对象的弹出式菜单选项包括: 选项 描述 设计视图 在视图设计器中编辑视图结构。设计器内的选项卡和选项是根据你所选择的

  • 若要添加一个新的视图,点击工具栏的 按钮,并点击画布的任意位置。你可以从浏览器的模型选项卡添加一个现有的视图,简单地从模型选项卡拖放视图到画布。 【注意】如果你右击视图连接器,你可以选择添加或删除顶点,以及更改它的颜色,或者前往源视图和目标表。 在画布中视图对象的弹出式菜单选项包括: 选项 描述 设计视图 在视图设计器中编辑视图结构。设计器内的选项卡和选项是根据你所选择的图表数据库类型而有所不同。

  • 问题内容: 我没有找到有关此问题的文章,但没有一个解决我的问题。 就像我说的那样。 ViewControllerA ViewControllerB 我试图将添加为的子视图,但是它 抛出类似“ ” 的错误。 下面是代码… ViewControllerA ViewControllerB只是一个带有标签的简单屏幕。 ViewControllerB EDIT 根据用户答案的​​建议解决方案,ViewCon

  • 本文向大家介绍在django admin中添加自定义视图的例子,包括了在django admin中添加自定义视图的例子的使用技巧和注意事项,需要的朋友参考一下 django admin提供了完善的用户管理和数据模型管理,方便实用。研究了一下在admin里面添加自己的页面。 在admin.py里继承django.contrib.admin.ModelAdmin基类 然后在里面写自己的视图处理函数。基

  • 问题内容: 在PostgreSQL 8.4中,我想从3个ID为ID的表中创建一个视图。因此,我想采用以下结构: 我可以选择,并从表: 如何在视图中创建列? 更新 我找到了解决方案: 但我不知道如何在中使用它。我怎么把它放在那里? 问题答案: 您不能使用删除或添加列。我引用ALTER VIEW上的手册 : 更改视图的各种辅助属性。(如果要修改视图的定义查询,请使用。) 但是一个简单的方法并不能解决问