如何将 XIB 文件中的 UIView 作为子视图添加到另一个 Xib 文件
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)是自定义的 UIView
I在另一个 XIB 文件中创建。
按一下按钮,我想将自定义 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 中,拖动一个子视图并将其 class 指定为 HeaderView 类型,期望它从 HeaderView.xib 加载该视图并插入它到位。你可以这样做:
A) 确保 HeaderView.xib 中的文件所有者设置为 HeaderView class。
B) 转到您的 GlobalView.xib,拖动子视图并使其成为 class 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;
}
我正在尝试将我在 XIB 中创建的自定义 UIView
作为子视图添加到我的 main.storyboard
中的视图控制器。我该怎么做?
matchScrollView
(标签 1)是 main.storyboard 中视图控制器中的 UIScrollView
,而 matchView
(标签 2)是自定义的 UIView
I在另一个 XIB 文件中创建。
按一下按钮,我想将自定义 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 中,拖动一个子视图并将其 class 指定为 HeaderView 类型,期望它从 HeaderView.xib 加载该视图并插入它到位。你可以这样做:
A) 确保 HeaderView.xib 中的文件所有者设置为 HeaderView class。
B) 转到您的 GlobalView.xib,拖动子视图并使其成为 class 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;
}