我在这里看到了一些似乎符合我所追求的答案,但我无法让它们中的任何一个起作用。
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 到底在哪里?
Best Answer-推荐答案 strong>
最简单的解决方案是让 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/
|