在 ContainerView 中显示 ViewController

Posted

技术标签:

【中文标题】在 ContainerView 中显示 ViewController【英文标题】:Showing a ViewController in a ContainerView 【发布时间】:2015-10-28 21:40:11 【问题描述】:

我正在尝试。 如果我使用内部 ViewController(与 ContainerView 位于同一项目中的源),它将按预期工作。 所以我正在使用另一个项目中的 ViewController,它不会显示出来。 我已经在外部 ViewController 的 viewDidLoad 中实现了一个 AlertDialog,AlertDialog 将会显示出来。

编辑: 我发现我必须将外部 ViewController 的 .xib 添加到构建阶段(在主项目中)的 Copy Bundle Resouces 中。 有没有其他方法可以解决这个问题?

代码:

#import "ViewController.h"
#import "Utilities/Form.h"
#import "TestForm.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize ListContainer = _ListContainer;

- (void)viewDidLoad 
    [super viewDidLoad];
    @try 

        Form *viewConnection = [[Form alloc]init];
        viewConnection.view.frame = _ListContainer.bounds;
        [_ListContainer addSubview:viewConnection.view];
        [self addChildViewController:viewConnection];
        [viewConnection didMoveToParentViewController:self];
    
    @catch (NSException *exception) 
            
    @finally 


    


- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


@end

【问题讨论】:

【参考方案1】:

alloc/init 几乎总是创建视图控制器的错误方法。它不提供包含视图内容的 XIB 文件或情节提要。您可能应该在您的 Form 类中提供一个自定义 init 方法,您可以调用该方法使用 instantiateViewControllerWithIdentifier 从其他项目的故事板创建视图控制器,或使用 initWithNibName:bundle: 使用 nib 创建它。

【讨论】:

感谢您的快速回复,但您的解决方案也不会显示。我问自己为什么如果我使用内部表单它会起作用,但如果我使用外部表单它就不起作用 “内部形式”? “外在形式”?这些术语是什么意思? 内部表单是我的主项目中的视图控制器,外部表单是包含的框架项目中的视图控制器 框架项目是你的还是第三方写的?它的设计是为了让您可以将它的视图控制器包含为其他视图控制器的子级吗?【参考方案2】:

终于明白了! 就像 Duncan C 提到的那样,我必须编写自己的 init。 结果如下:

//
//  Form.m
//  Utilities

#import "Form.h"

@interface Form ()

@end

@implementation Form

-(id)init

    NSBundle* resourcesBundle = [NSBundle bundleForClass:[Form class]];
    self = [super initWithNibName:@"Form" bundle:resourcesBundle];
    return self;


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


- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.

*/

@end

【讨论】:

以上是关于在 ContainerView 中显示 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

嵌入在 containerView 中的 PageViewController 显示前一个视图的小边距

在 Cocoa App Swift [Mac OS] 中显示在 containerView 内的 NSViewController 不会与 Container 的边界对齐

在 ContainerView 中打开不同的视图

ContainerView具有多个嵌入segues

具有多个嵌入 segues 的 ContainerView

ContainerView 标签栏?