如何将XIV文件中的UIView作为子视图添加到另一个Xib文件中

时间:2015-04-14 14:45:40

标签: ios objective-c xcode uiview xib

我正在尝试将我在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作为子视图。

1 个答案:

答案 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;
}