繁体   English   中英

在子视图中添加 UIViewController

[英]add UIViewController in subview

我不知道这是否是搜索“在子视图中添加 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''

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

您应该使用子包含概念,这里 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
}

更多详情请参考苹果文档: https : //developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html

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

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

在 Interface Builder 中添加容器视图 当你加载一个带有一个或多个容器视图的视图控制器时,Interface Builder 也会加载与这些视图关联的子视图控制器。 子项必须与父项同时实例化,以便可以创建适当的父子关系。

您只需使用 StoryBoards 即可完成此操作

  • 打开故事板并选择您的蓝色视图所在的视图控制器,打开实用程序搜索 ContainerView 并将其拖到您的蓝色视图中,这将自动添加一个视图控制器作为您的视图的子视图。 您可以在大小检查器中调整容器视图的大小。

在此处输入图片说明

我已经解决了关于第二个 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];

我希望能帮助你。

非常感谢

从 iOS5 开始,您可以向 UIViewController 添加 childViewController ..这是制作更小、更可重用的 viewController 的好方法,我也非常喜欢它。

你真的很接近,但你只需要多几行代码..

///
 [self addChildViewController:sample];

 [self.testView addSubview:sample.view]; //you already have this..

 [sample didMoveToParentViewController:self]; 

在您 viewWillDisappear: 或您需要像这样清理的其他拆卸方法之一:

//we'll need another pointer to sample, make it an iVar / property..
   [sample willMoveToParentViewController:nil];  // 1
   [sample removeFromSuperview];            // 2
   [sample removeFromParentViewController];      // 3

您可以在此处阅读有关包含子视图控制器的 Apple 文档https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

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 addChildViewController:sample];
[self.testView addSubview:sample.view];

我正在尝试在子视图中添加 UIViewController,这项工作。 在 UIViewController 上,我在 .h 文件中添加了 2 个按钮:

-(IBAction)matchButtonAction:(id)sender;
-(IBAction)closeButtonAction:(id)sender;

在 .m 文件中:

-(IBAction)matchButtonAction:(id)sender
{
    NSLog(@"matchButtonAction");
}
-(IBAction)closeButtonAction:(id)sender
{
    NSLog(@"closeButtonAction");
}

但我没有看到日志。

我需要在 UIViewController instantiateViewControllerWithIdentifier 上添加相同的参数吗?

如何解决问题?

我的 UIViewController 初始化是:

AlertDialogViewController *alertDialogView = (AlertDialogViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"alertDialogView"];         
        [alertDialogView willMoveToParentViewController:self];
        [viewController.view addSubview:alertDialogView.view];
        [viewController addChildViewController:alertDialogView];
        [alertDialogView didMoveToParentViewController:viewController];

由于您的视图控制器在情节提要中,因此您应该使用instantiateViewControllerWithIdentifier从情节提要中获取 VC。

SampleViewController * sample = [self.storyboard instantiateViewControllerWithIdentifier:@"IdOfSampleViewController"];
sample.view.frame = CGRectMake(0, 0, self.testView.bounds.size.width, self.testView.bounds.size.height);
[self.testView addSubview:sample.view];

不要忘记在故事板中为SampleViewController添加标识符

我尝试使用此代码:

SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:nil bundle:nil];

 secondViewController.view.frame = CGRectMake(0, 0, self.mySubView.bounds.size.width, self.mySubView.bounds.size.height);

 [self addChildViewController:secondViewController];
 [self.viewDialogSolution addSubview:secondViewController.view];

但我只看到 myview 而不是 secondViewController 的布局。

何来解决问题?

非常感谢

让 controller:SecondViewController = self.storyboard!.instantiateViewController(withIdentifier: "secondViewController") as! 第二个视图控制器

controller.view.frame = self.view.bounds

controller.willMove(toParent: self)

self.view.addSubview(controller.view)

self.addChild(控制器)

controller.didMove(toParent: self)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM