我的目标是,在他自己的 XIB 中设计一个子类 UIView
(我们称它为 infoView
),这样我就可以在许多 UIViewController< 中展示它
的。
问题:
到目前为止,当我将 UIView
添加到 UIViewController
时,我总是必须将 UIViewController
作为 UIView 的文件所有者
的 .xib 文件加载 View ,内容如下:
...
//this is inside the calling UIViewController's method
// InfoView *infoView is ivar and a subclass of UIView
infoView = nil;
NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:@"InfoView"
owner:self options:nil];
for (id object in bundle) {
if ([object isKindOfClass:[InfoView class]])
infoView = (InfoView *)object;
}
[[self view] addSubview:infoView];
...
但我想在许多不同的 UIViewController
中使用相同的 UIView
,所以我实际上不想要一个文件的所有者,也许除了类本身。在 ThomasM's question他正在将 UIView
本身设置为文件的所有者,但没有成功。
在那里的答案中,我找到了将文件所有者设置为 nil 的解决方案。为此,我必须将 Interface Builder 对象库中的所有调用 UIViewController
对象添加到 InfoView.xib 文件,并将它们与它们的 infoView
socket 连接。
但这感觉不对。 所以在这里我想收集解决方案
将 UIView
与他的 xib 文件封装在一起,以便在许多不同的 View Controller 中使用它。你们是怎么处理的?
感谢您的帮助。
编辑:
infoView
类似于一个叠加层,当用户按下其中一个 View Controller 上的按钮时会出现。它不是 View Controller 的“主” View 。它提供了关于他的 superviews View Controller 的 View 的详细信息,然后会消失。我只用不同的内容填充 infoView
并丢弃了所有调用 View Controller 。
最佳答案
喜欢霍兰斯 answer指出我正在使用 UINib
。
要使用它,请保留 .xib 文件所有者 nil
并将 infoView 的所有自定义放置在您的 InfoView 类实现的 initWithCoder:
方法中。如果您获取 InfoView.xib
将被调用,例如:
// here InfoView is the name of the .xib file
UINib *infoNib = [UINib nibWithNibName:@"InfoView" bundle:nil];
NSArray *topLevelObjects = [infoNib instantiateWithOwner:self options:nil];
QInfoView *infoView = [topLevelObjects objectAtIndex:0];
关于iphone - 最佳实践 : Presenting a Subclassed UIView (with own xib) as subview of UIViewControllers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7120537/