[英]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.