在 XIB 中连接 UIView 并使用 Story board 中的 View Controller 加载它

Posted

技术标签:

【中文标题】在 XIB 中连接 UIView 并使用 Story board 中的 View Controller 加载它【英文标题】:Connect UIView in XIB and load it using View Controller in the Story board 【发布时间】:2014-07-14 15:44:12 【问题描述】:

我有一个加载了默认视图的XYZViewController(情节提要中的简单 UIViewController)。我有一个XYZView 类型,我在.xib 文件中有UIView

在 XYZViewController 类中,我将XYZView 的属性定义为IBOutlet。棘手的是我不知道如何将此属性连接到情节提要中的 UIViewController(或 .xib 文件中的 UIVIew),这样 —

IBOutlet 连接到正确的 UIView xib 中的视图成为 UIViewController 默认视图的添加子视图。

(我在这个问题下听起来很狡猾和/或我可能没有非常正确的方式来解释它,但这是我能做到的最好的。)

编辑:进一步澄清可能会更容易。我只是不想对自己说:

XYZView *xyzView = [[XYZView alloc] initWithFrame...]; 

[self.view addSubview:xyzView];

也许有帮助。

【问题讨论】:

编辑后我的答案保持不变。你仍然有相同的选择。 :) 【参考方案1】:

好的,根据我告诉你的有以下...

XYZViewController 其代码在XYZViewController.h and .m 文件中。

.storyboard 文件 在故事板文件中,您有一个视图控制器,您已将子类设置为XYZViewController

.xib 文件 在 xib 文件中,您有一个已定义为子类 XYZView 的视图。

对吗?

我猜你所做的是以下...

在 .xib 文件中,您已经布置了 XYZView 并在其上放置标签、按钮等。

视图控制器正在由情节提要创建。但是现在你想给它附加标签和按钮。

对吗?

如果这一切都是正确的,那么你有几个选择。

最简单的选择

删除 xib 文件。除非 XYZView 在应用程序的多个位置(即在不同的视图控制器内)使用,否则你真的应该在情节提要中完成所有这些布局。将按钮和标签添加到情节提要中的XYZViewController

这将允许您连接 IBOutlets 和 IBActions,这一切都会正常工作,因为情节提要正在创建然后设置出口和动作。

下一个选项

因为您已经在 xib 文件中创建了视图,所以您必须在代码中从该 xib 文件中加载它,然后将其添加到您的视图控制器中。

类似...

- (void)viewDidLoad

    [super viewDidLoad];

    self.xyzView = [[[NSBundle mainBundle] loadNibNamed:@"XYZView" owner:self options:nil] objectAtIndex:0];

    [self.view addSubview:xyzView];

然后你可以做类似的事情......

self.xyzView.someLabel.text = @"This is the text";

您仍然无法连接出口和操作,但这是因为 xib 没有创建视图控制器。它是由故事板创建的。

不过,这可能会变得一团糟。我真的只建议在一个单独的 xib 中创建一个视图,如果它是你一遍又一遍地重复使用的东西(比如 5 星评级视图或其他东西)。

你绝对不能做的事

好吧,我想我可能已经想到了你在做什么。

在情节提要中,您已将视图的子类设置为 XYZView,并且您希望它能够拾取您在 xib 文件中为 XYZView 定义的标签和按钮等。

这绝对行不通。

storyboard 和 xib 是完全独立的对象。如果您想将它们一起使用,那么代码会涉及从 nib 加载视图,然后将其添加到在情节提要中创建的视图控制器中。

【讨论】:

好的,这有帮助。执行您在第一个建议中描述的操作没有问题;我只是想知道这是否可能。谢谢! @flippex17 不用担心。只是想提供所有选项。第一个绝对是我会做的方式。 :)

以上是关于在 XIB 中连接 UIView 并使用 Story board 中的 View Controller 加载它的主要内容,如果未能解决你的问题,请参考以下文章

带有 Xib 文件的 UIView 的子类

UIView 和 XIB 连接。正在显示吗?

从 xib 加载子类时如何设置子类 UIView 属性的值

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

使用 Swift 在 Xcode 6 中使用 xib 在自定义 uiview 中获取 SIGABRT

如何将 UITableView 作为子视图添加到 xib 中的 UIView?