以编程方式创建的 UIViewController 加载界面构建器 view.xib 文件

Posted

技术标签:

【中文标题】以编程方式创建的 UIViewController 加载界面构建器 view.xib 文件【英文标题】:Programmatically created UIViewController loading an Interface builder view.xib file 【发布时间】:2012-09-27 17:05:32 【问题描述】:

如何从以编程方式创建的 UIViewController 加载界面构建器创建的视图?我正在使用 Objective-C。

我能够从一个不使用界面构建器的参考项目开始,所以我没有故事板。我已经成功地以编程方式加载了视图,但希望能够加载一些界面构建器创建的视图。

更多细节:我有 2 个视图控制器 A 和 B。我目前在 A。我单击一个按钮,然后在该按钮处理程序中加载 Viewcontroller B,如下所示:

self.viewControllerB = [[ViewControllerB alloc] init];
[self.navigationController pushViewController:viewControllerB animated:YES]

我手动创建了一个带有 .m 和 .h 的 ViewB。如果我使用 initWithFrame 在其中定义了一堆控件并以编程方式布置它们,我可以如上所述成功调用它。

我向项目添加了一个新文件,它是一个 UIView,它在构建器中显示它。将 TableView 拖放到视图上,现在我只想看看这个负载。 我将 xib 命名为 ViewB.xib,我将 Class 设置为 ViewB,如下图所示(在答案 1 中)

【问题讨论】:

您是否尝试过调用实例方法:- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle? 是的,除非我对 nibName 做错了什么。我如何设置和确切知道 nibName 是什么? 笔尖名称是您在创建它时命名的任何名称。 【参考方案1】:

当您需要从 .xib 加载视图时,请使用:

首先在界面生成器中为视图制作一个nib,并确保将其自定义类设置为您的视图类,见图:

然后像这样在你的代码中加载它:

MyCustomNibView *myView;
NSArray *topLevelItems = [[NSBundle mainBundle] loadNibNamed:@"MyCustomNibView" owner:nil options:nil];

for (id view in topLevelItems) 
    if ([view isKindOfClass:[MyCustomNibView class]]) 
       myView = (MyCustomNibView *)view;
       break;
    

【讨论】:

上例中的代码到哪里去了?这是在“MyCustomNibView”的相应 .m 和 .h 文件中,还是不需要的。这是直接在视图控制器中吗?如果在视图控制器中,它如何识别没有 .h 引用的“MyCustomNibView”?我假设在上面的图片中,类名需要是“MyCustomNibView”(对于这个例子)。 @Kazern 您需要一个“MyCustomNibView.h”、“MyCustomNibView.m”和一个“MyCustomNibView.xib”来定义您的视图及其成员。在图片中,如您所料,该类应该是“MyCustomNibView”。最后,您在视图控制器中导入 .h 并在您想要加载视图时使用上面的代码。它可以在“viewDidLoad”或某个按钮点击或...等中。使用上面的代码获取视图后,只需将其添加到视图层次结构中。

以上是关于以编程方式创建的 UIViewController 加载界面构建器 view.xib 文件的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建的 UIViewController 加载界面构建器 view.xib 文件

以编程方式创建 UIView 和 UIViewController 并链接在一起的正确方法

基于响应 json 以编程方式创建 UIViewController

如何为我在 Swift 中以编程方式创建的 UIViewController 子类创建 init?

如何在 Swift 中以编程方式创建新的 UIViewController

如何在 Storyboard 上创建 Segue,从以编程方式注册的 UICollectionViewCell 到新的 UIViewController?