![](/img/trans.png)
[英]How to initialize UIViewController with existing UIView in .xib
[英]How to “import” a UIView XIB into a UIViewController XIB?
我在这里看到了一些答案,这些答案似乎可以满足我的要求,但是我无法使它们中的任何一个起作用。
MyView
是一个UIView子类,具有在MyView.xib
布置和设置样式并绑定到MyView.(h|m)
IBOutlet的少数图像和文本字段。 没有在XIB中设置File's Owner
,但是MyView是顶级对象的类。 在运行时,我通过NSBundle's
loadNibNamed
各种MyView动态加载到某些视图控制器中。 一切顺利。
但是我还有另一个视图控制器MyVC
,在设计时,我想用几个MyView实例填充它。 按照直觉,我在MyVC.xib
布置了一个与MyView相同大小的UIView对象,将其类型设置为MyView
,在MyVC.h
添加了IBOutlet声明,并建立了连接。
当我运行时, MyVC
显示MyView
。 但是调试表明已经建立连接,该视图确实是MyView
,并且MyView's
awakeFromNib
确实执行了。 而且我确定MyVC's
MyView
位于层次结构的顶部,因为我将其背景设置为漂亮的鲜红色。 那么MyView
在哪里呢?
最简单的解决方案是使MyView
具有一个子视图,该子视图是其其余子视图的容器。 这给你接触的之间有什么在单点MyVC.xib
,什么是在MyView.xib
,并且让你在既xibs连接插座。
在MyVC.xib
,将每个占位符视图的类设置为MyView
。
在MyView.xib
,将顶级视图的类设置为UIView
。 将文件所有者的类设置为MyView
。 如果MyView.xib
中已连接MyView
上的任何插座,则由于顶级视图不再具有这些插座,因此您需要将它们重新连接到File的Owner。
在-[MyView initWithCoder:]
,加载MyView.xib
并将其顶级视图添加为子视图。 未经测试的示例:
+ (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)initWithCoder:(NSCoder *)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 respondsToSelector:@selector(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
的网点东西MyVC.xib
和东西MyView.xib
,你可以在其他对象的出口连接MyVC.xib
和MyView.xib
以实例MyView
。 但是,你不能在连接其他对象的网点MyVC.xib
在其他物体MyView.xib
反之亦然。
原文:覆盖initWithCoder,一个不好的主意,如下面的评论所述
新建议:
然后在MyVC的viewDidLoad:方法中:
使用您的笔尖创建一个新的MyView实例,对于MyView中的每个实例
将每个空的(即占位符)MyView替换为刚创建的MyViews,确保正确设置了框架(设置了所有属性/ ivars,并使用'-(void)exchangeSubviewAtIndex:(NSInteger)index1和SubviewAtIndex:(NSInteger)index2 '将子视图数组中的旧视图替换为新视图)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.