我正在尝试将我在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
作为子视图。
答案 0 :(得分:3)
您遇到的问题完全正常。 Apple设计它的方式不允许将自己的xib重用自定义视图到其他xib中。
假设您有一个名为HeaderView的自定义视图,其中包含一个名为HeaderView.xib的自定义xib。并且假设您希望能够在另一个名为GlobalView.xib的xib中拖动子视图并将其类指定为HeaderView类型,期望它从HeaderView.xib加载该视图并将其插入到位。你可以这样做:
A)确保HeaderView.xib中的文件所有者设置为HeaderView类。
B)转到你的GlobalView.xib,拖动子视图并使其成为HeaderView类。
C)在HeaverView.m中实现initWithCoder,如果加载视图后没有子视图意味着它从GlobalView加载,然后从正确的笔尖手动加载,连接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;
}