[英]How to add an UIView from a XIB file as a subview to another Xib file
我試圖將我在XIB中創建的自定義UIView
添加到我的main.storyboard
中的視圖控制器作為子視圖。 我怎樣才能做到這一點?
matchScrollView
(標記1)是main.storyboard中視圖控制器中的UIScrollView
,而matchView
(標記2)是我在另一個XIB文件中創建的自定義UIView
。
按下按鈕,我想將自定義UIView
添加到UIScrollView
作為子視圖。 但是我怎么能讓它顯示出來呢? 我想我還沒有分配和初始化它,同時指示位置等,但我怎么能這樣做? 我嘗試了不同的方法但沒有成功 我可以以編程方式創建UIViews
,但尚未找到從XIB加載UIView
的方法。
-(IBAction) buttonTapped:(id)sender {
UIScrollView *matchScrollView = (UIScrollView *) [self.view viewWithTag:1];
UIView *matchView = (UIView *) [self.view viewWithTag:2];
[matchScrollView addSubview:matchView];
}
我在另一個XIB文件中創建自定義UIView
而不是直接在我的main.storyboard視圖控制器上實現它的原因是因為我想多次重復使用相同的視圖。 所以UIScrollView
具有的許多子視圖UIViews
。
我希望我可以創建大量的MatchView
實例,並將它們全部添加到matchScrollView
作為子視圖。
你遇到的問題是完全正常的。 Apple設計它的方式不允許將自己的xib重用自定義視圖到其他xib中。
假設您有一個名為HeaderView的自定義視圖,其中包含一個名為HeaderView.xib的自定義xib。 並且假設您希望能夠在另一個名為GlobalView.xib的xib中拖動子視圖並將其類指定為HeaderView類型,期望它從HeaderView.xib加載該視圖並將其插入到位。 你可以這樣做:
A)確保HeaderView.xib中的File's Owner設置為HeaderView類。
B)轉到GlobalView.xib,拖動子視圖並使其成為HeaderView類。
C)在HeaverView.m中實現initWithCoder,如果在加載視圖后沒有子視圖意味着它從GlobalView加載,然后從正確的nib手動加載它,連接IBOutlets並設置框架和autoresizingmasks如果你想使用GlobalView的框架(這通常是你想要的)。
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self.subviews.count == 0) { //means view got loaded from GlobalView.xib or other external nib, cause there aren't any subviews
HeaverView *viewFromNib = [[NSBundle mainBundle] loadNibNamed:@"HeaverView" owner:self options:nil].firstObject;
//Now connect IBOutlets
self.myLabel1 = viewFromNib.myLabel1;
self.myLabel2 = viewFromNib.myLabel2;
self.myLabel3 = viewFromNib.myLabel3;
[viewFromNib setFrame:self.bounds];
[viewFromNib setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
[self addSubview:viewFromNib];
}
return self;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.