我在这里看到了一些似乎符合我所追求的答案,但我无法让它们中的任何一个起作用。
MyView
是一个 UIView 子类,其中有一些图像和文本字段在 MyView.xib
中布局和设置样式,并绑定(bind)到 MyView.(h |m)
。在XIB中没有设置File's Owner
,但是MyView是顶层对象的类。在运行时,我通过 NSBundle's
loadNibNamed
将各种 MyView 动态加载到某些 View Controller 中。一切都很顺利。
但我有另一个 View Controller ,MyVC
,在设计时我想填充几个 MyView 实例。根据直觉,我在 MyVC.xib
中布局了一个与 MyView 大小相同的 UIView 对象,将其类型设置为 MyView
,在 MyVC 中添加了一个 IBOutlet 声明。 h
,然后连接上。
当我运行时,MyVC
没有显示 MyView
。但是调试表明连接已经建立, View 确实是一个MyView
,并且MyView's
awakeFromNib
确实执行了。而且我确信 MyVC's
MyView
位于层次结构的顶部,因为我将其背景设置为漂亮的亮红色。那么MyView
到底在哪里?
最简单的解决方案是让 MyView
有一个 subview ,它是其余 subview 的容器。这为您提供了 MyVC.xib
中的内容和 MyView.xib
中的内容之间的单点联系,并允许您连接两个 xib 中的 socket 。
在MyVC.xib
中,将每个占位符 View 的类设置为MyView
。
在MyView.xib
中,设置顶层 View 的类为UIView
。将 File's Owner 的类设置为 MyView
。如果您在 MyView
上有任何在 MyView.xib
中连接的 socket ,则您需要将它们重新连接到 File's Owner,因为顶级 View 不再具有这些 socket 。
在 -[MyView initWithCoder:]
中,加载 MyView.xib
并将其顶级 View 添加为您的 subview 。未经测试的示例:
+ (UINib *)nib {
static dispatch_once_t once;
static UINib *nib;
dispatch_once(&once, ^{
nib = [UINib nibWithNibName:NSStringFromClass(self) bundle:[NSBundle bundleForClass:self]];
});
return nib;
}
- (id)initWithCoderNSCoder *)aDecoder {
if (self = [super initWithCoder:aDecoder]) {
NSArray *contents = [[self.class nib] instantiateWithOwner:self options:nil][0];
UIView *containerView = contents[0];
// Make sure the container view's size tracks my size.
containerView.frame = self.bounds;
containerView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
self.autoresizesSubviews = YES;
if ([self respondsToSelectorselector(setTranslatesAutoresizingMaskIntoConstraints]) {
self.translatesAutoresizingMaskIntoConstraints = YES;
containerView.translatesAutoresizingMaskIntoConstraints = YES;
}
// If you're using autolayout in both xibs, you should probably create
// constraints between self and containerView here.
[self addSubview:containerView];
}
return self;
}
这样你可以将 MyView
的 outlet 连接到 MyVC.xib
中的事物和 MyView.xib
中的事物,并且您可以将MyVC.xib
和MyView.xib
中其他对象的导出连接到MyView
的实例。但是,您不能将 MyVC.xib
中其他对象的 outlet 连接到 MyView.xib
中的其他对象,反之亦然。
关于ios - 如何将 UIView XIB "import"转换为 UIViewController XIB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15509386/
欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) | Powered by Discuz! X3.4 |