繁体   English   中英

显示从故事板中的xib加载的UIView的内容

[英]Showing a content of a UIView loaded from a xib in a storyboard

当前设置

我有一个UIView的子类,它从xib文件加载内容 - 称之为XibOwnerClass 此外,在其他类中,有一个名为Triangle类,它可以帮助我创建带或不带边框的三角形,具有不同的笔触或填充颜色等。该类可以在故事板中设计,并且其一些属性被定义为IBInspectable

目前,在我的xib文件中,我使用此三角视图并通过IB设置其可检查属性。 这真的很酷很方便......所以如果我看一下xib ,我会在其他视图中看到三角形视图。

所以,让我们走得更远。 为了使用这个XibOwnerClass ,我将UIView元素拖到故事板上,并将其自定义类更改为XibOwnerClass ,因此我获得了特定于XibOwnerClass设计属性。 所以,我可以在IB设置所有内容,当我运行应用程序时,一切正常。

问题

即使这有效,我想知道是否有办法,在故事板上拖动多个视图(类XibOwnerClass ),并且能够通过Interface Builder单独配置所有这些视图?

目前,当我拖动UIView并将其自定义类更改为XibOwnerClass我什么也看不见。 我的意思是,视图在那里,并且它具有标准属性+可检查属性。 但是我在这个新视图xib不到xib中定义的三角形。 有没有办法做到这一点?

我知道xib在我的情况下被重用(并且它意味着像这样使用),所以如果我在xib更改某些内容,那么xib加载的所有视图都会受到影响。 但是有多种方法可以从同一个xib加载多个视图,但加载后,要查看它们并单独设置它们?

这是我从xib加载的xib

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

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

        UIView *myView = [[[NSBundle mainBundle] loadNibNamed:@"MyXib" owner:self options:nil] firstObject];

        if (myView){

            myView.frame = CGRectMake(myView.frame.origin.x, myView.frame.origin.y, self.frame.size.width, self.frame.size.height);
            [self addSubview:myView];

            //Initialize other stuff

            [self commonInit];
        }
    }

    return self;
}

然后在awakeFromNib:我使用可检查属性的值...

编辑:

另外我没有initWithFrame:实现,但我认为如果从nib加载则不需要它(因为它没有被执行)。 但也许在设计时需要这个?

当你不共享类代码时,不能说出错了什么。 但我猜你没有使用prepareForInterfaceBuilder。 在您的XibOwnerClass中覆盖prepareForInterfaceBuilder并调用其中的视图设置,例如更改背景颜色等。

override func prepareForInterfaceBuilder() {
        //prepare setups or things to show in storyboard

}

好的,我已经解决了。 原来,我不应该使用主束,而是捆绑该类一样,描述在这里

所以这是代码:

NSBundle *bundle = [NSBundle bundleForClass:[self class]];

@ Mohammadalijf的答案一般正确的。 这不是我的问题的直接解决方案。 但是后来,当我修复了bundle的东西时,我就像他说的那样使用了prepareForInterfaceBuilder,并在那里初始化了所有东西,所以在设计时一切都可用。

这里也可以找到一些与这一切相关的有用的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM