设计一个 XIB 并在不同的 UIViewController 中重用它

Posted

技术标签:

【中文标题】设计一个 XIB 并在不同的 UIViewController 中重用它【英文标题】:Design one XIB and re-use it in different UIViewControllers 【发布时间】:2014-03-10 21:14:07 【问题描述】:

我有一个UIView,我想在我的每个UIViewControllers 中使用它。主 UI 是用 Storyboard 设计的。额外的UIView 有自己的XIB。

所以我不想将额外的UIView 的 UI 手动放入每个UIViewController,并连接每个UIViewController 上的插座。所以我想也许可以在一个 XIB 中创建 UI 和连接,然后以某种方式重用它。这可能吗?如果是怎么办?

【问题讨论】:

XIB 不是总是与某些特定的控制器类相关联吗? @KodeCharlie - 我相信他想将 XIB 与自定义 UIView 对象相关联,而不是 UIViewController 【参考方案1】:

只需将此行添加到您的 ViewControllers 即可引用您的自定义视图:

YourView *yourView = (YourView *)[[NSBundle mainBundle] loadNibNamed:@"YourXIB"
                                                               owner:self
                                                             options:nil].firstObject;

但由于您希望在所有 ViewControllers 中都使用此自定义视图,我建议您拥有一个包含上述行的 UIViewController 子类,然后为您的项目中的每个其他子类创建 UIViewController 子类。这样您就可以在每个 ViewController 中引用您的自定义视图,但只需编写一次这一行。

【讨论】:

这似乎有帮助,但我遇到了另一个问题。我的 UIVIew 上的 IBActions 工作完美。但似乎 IBOutlets 没有初始化。当我检查我的 UIImageView 时,调试器说它是 NULL。为什么会这样? @user1990524 - 如果您在 XIB 中创建了 UIImageView,则应该初始化它。我会检查所有内容并确保所有插座都已连接等。尝试从 ViewController 修改您的自定义视图。如果您仍然无法弄清楚,请再问一个问题。【参考方案2】:

我认为在函数initWithNibName: 中保持相同的名称是可能的,因此您可以在其中一个控制器中执行此操作:

UIViewController *oneViewController = [[FirstViewControllerClass alloc] initWithNibName:@"MyXIBThatWillStayTheSame" bundle:nil];
[self presentModalViewController:oneViewController animated:YES];

然后在另一个中执行此操作:

UIViewController *anotherViewController = [[AnotherViewControllerClass alloc] initWithNibName:@"MyXIBThatWillStayTheSame" bundle:nil];
[self presentModalViewController:anotherViewController animated:YES];

【讨论】:

以上是关于设计一个 XIB 并在不同的 UIViewController 中重用它的主要内容,如果未能解决你的问题,请参考以下文章

NIB/XIB 中的 StackView 约束行为是不是不同?

XIB 和模拟器/iOS 设备中元素的不同位置

使用 XIB 创建自定义 UIView

在另一个 xib 中使用 xib 对象

如何在代码中创建自定义 UIButton 并在 xib 中使用它?

UITableViewCell 为不同的方向和单元格类型加载自定义 XIB