如何在另一个 ViewController 中将带有 Xib 的 ViewController 显示为 SubView

Posted

技术标签:

【中文标题】如何在另一个 ViewController 中将带有 Xib 的 ViewController 显示为 SubView【英文标题】:How to show a ViewController with Xib in Another ViewController as a SubView 【发布时间】:2016-01-09 10:13:27 【问题描述】:

我有一个Base Class 我从这个Base Class 继承了我的Parent Class

现在我有另一个ViewControllerXIB。我只想在我的父类中展示这个XIB as 一个视图。

我的 ViewController 与 XIB 的名称是:SearchResultDisplayVC

这段代码我正在使用我的基类将我的 XIB 显示为视图:

 - (void)showSearchResultsView
 

SearchResultDisplayVC  *searchView =(SearchResultDisplayVC *)[[[NSBundle mainBundle] loadNibNamed:@"SearchResultDisplayVC" owner:[SearchResultDisplayVC class] options:nil] firstObject];


[self.view addSubview:searchView.view];


在我的父类中,我将其称为“”

[self showSearchResultsView];

虽然我在编译时没有收到任何错误消息,但是当我运行我的应用程序时它会崩溃并显示以下消息:

*** Terminating app due to uncaught exception
'NSUnknownKeyException',
reason: '[<SearchResultDisplayVC 0x1104bb380> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key view.'

【问题讨论】:

是的,您将 ViewController 添加为 View "addSubView"。 我怎样才能将它添加为子视图或者是他们做@the_UB的任何其他方式 检查Micky's and others answer here。 你应该检查你从 nib 收到的第一个对象。我猜它本身就是一个视图而不是你的视图控制器。如果那是一个视图,你可以简单地将它添加到当前视图 【参考方案1】:

您必须在父视图中添加为子视图控制器。

  SearchResultDisplayVC * searchView = [[SearchResultDisplayVC alloc] initWithNibName:@"SearchResultDisplayVC" bundle:nil];
    self.addChildViewController(searchView)

【讨论】:

添加子视图后如何【参考方案2】:

我希望您的 SearchResultDisplayVC.xib 文件有问题,请检查文件所有者中的视图的插座连接,它应该设置为主视图,以便任何视图控制器都能正常工作。如下所示,

所有视图控制器都希望从 nib 文件中定义和映射“视图”对象。您有一个视图控制器笔尖,但其中没有称为“视图”的插座。否则,您编写的任何代码都可以正常工作。

【讨论】:

【参考方案3】:

请将您的“showSearchResultsView”修改为:

- (void)showSearchResultsView
 

UIView  *searchView =(SearchResultDisplayVC *)[[[NSBundle mainBundle] loadNibNamed:@"SearchResultDisplayVC" owner:[SearchResultDisplayVC class] options:nil] firstObject];


[self.view addSubview:searchView];


【讨论】:

感谢您的回复..但是当我运行此代码时,我收到警告【参考方案4】:

经过这么多研究,我终于找到了将其添加到 window 的方法。

现在我可以使用viewDidLoad 和所有其他方法了。

- (void)showSearchResultsView


if(!self.searchDisplayView)

    self.searchDisplayView = [[SearchResultDisplayVC alloc] initWithNibName:@"SearchResultDisplayVC" bundle:nil];

    self.searchDisplayView.delegate = self;


    CGSize mainScreenSize = [[UIScreen mainScreen] bounds].size;

    self.searchDisplayView.view.frame = CGRectMake(0,
                                               0,
                                               mainScreenSize.width,
                                               mainScreenSize.height);


AppDelegate *delegate =  (AppDelegate *)[[UIApplication sharedApplication] delegate];
[delegate.window addSubview:self.searchDisplayView.view];


 

【讨论】:

以上是关于如何在另一个 ViewController 中将带有 Xib 的 ViewController 显示为 SubView的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一个 TabController 中选择 ViewController?

如何在另一个 ViewController 前面将 UITableViewController 显示为向上滑动的手势?

在另一个 ViewController 中的 ViewController 之间显示和切换

在另一个视图控制器中添加视图控制器作为子视图

如何在不知道新的 VC 的情况下将 ViewController 呈现在另一个之上?

在 swift 3 中启动应用程序时,如何在另一个 ViewController 中预加载 UIWebView?