在 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),这样 —
(我在这个问题下听起来很狡猾和/或我可能没有非常正确的方式来解释它,但这是我能做到的最好的。)
编辑:进一步澄清可能会更容易。我只是不想对自己说:
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 并在不同的 UIViewController 中重用它