initWithCoder:自定义视图 - 确定正在实例化的视图控制器

时间:2016-08-17 16:00:35

标签: ios objective-c storyboard xib initwithcoder

我准备了一个带有关联Xib文件的自定义UIView子类。在故事板上,我放置了一个UIView并将它的类设置为我的自定义子类。在自定义视图的initWithCoder:方法中,我加载了xib并初始化了子视图。这很有效。

现在我想在其他地方使用相同的自定义视图,但我希望我的子视图的布局不同。我想在同一个Xib文件中创建第二个自定义视图布局,并根据我的哪个视图控制器包含自定义视图加载正确的视图布局。由于我的所有子视图和所有逻辑都是相同的,只是布局不同,我正在寻找这样的东西:

-(id)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super initWithCoder:aDecoder]) {
        if (self.subviews.count == 0) {
            UINib *nib = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:nil];
            UIView *subview;
            if ([/*instantiating VC isKindOfClass:viewController1.class]*/) {
               subview = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0];
            }
            else if ([/*instantiating VC isKindOfClass:viewController2.class]*/) {
                subview = [[nib instantiateWithOwner:self options:nil] objectAtIndex:1];
            }
            subview.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame));
            subview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
            [self addSubview: subview];
        }
    }
    return self;
}

有没有办法访问有关实例化此自定义视图的视图控制器的信息?

1 个答案:

答案 0 :(得分:0)

是的,有一种方法,放置两个视图并将两个视图的标签设置为不同,例如故事板中的10和20,其中您要使用UIView子类设置自定义类。

然后在你的UIView子类中执行以下操作:

-(id)initWithCoder:(NSCoder *)aDecoder {

if (self = [super initWithCoder:aDecoder]) {

    if (self.subviews.count == 0) {

        UINib *nib = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:nil];
        UIView *subview;
        if (self.tag == 10) {
            subview = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0];
        }
        else if (self.tag == 20) {
            subview = [[nib instantiateWithOwner:self options:nil] objectAtIndex:1];
        }

        subview.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame));
        subview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        [self addSubview: subview];
    }


}
return self; }

故事板中的标签10视图将被您的第一个视图替换,故事板中的标签20视图将被您的第二个视图替换。

构建,运行和享受!!!