如何将 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;
}