最簡單的解決方案是,更換舊視圖使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