最简单的解决方案是,更换旧视图使MyView
有一个子视图,它是其后代视图的其余部分的容器。这使您可以在MyVC.xib
和MyView.xib
中的内容之间建立单点联系,并可让您在两个xib中连接插座。
在MyVC.xib
中,将每个占位符视图的类别设置为MyView
。
在MyView.xib
中,将顶级视图的类别设置为UIView
。将文件所有者的类别设置为MyView
。如果您在MyView.xib
中连接的MyView
上有任何网点,您将需要将它们重新连接到文件所有者,因为顶级视图不再具有这些网点。
在-[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
中的其他对象,反之亦然。
的意见是'awakeFromNib''d,但将有称为其'-initWithCoder' init方法,从视图控制器XIB而非MyView.xib的数据。如果这是有道理的... – 2013-03-19 20:14:08