【问题标题】:Programmatically created UIViewController loading an Interface builder view.xib file以编程方式创建的 UIViewController 加载界面构建器 view.xib 文件
【发布时间】: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 是什么?
  • 笔尖名称是您在创建它时命名的任何名称。

标签: ios uiviewcontroller xib


【解决方案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”或某个按钮点击或...等中。使用上面的代码获取视图后,只需将其添加到视图层次结构中。
猜你喜欢
  • 1970-01-01
  • 2011-02-10
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多