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

Ios 在故事板中显示从xib加载的UIView的内容,ios,objective-c,xcode,uiview,interface-builder,Ios,Objective C,Xcode,Uiview,Interface Builder,当前设置 我有一个UIView的子类,它从一个xib文件加载一个内容,称之为XibOwnerClass。此外,在其他类中,还有一个名为Triangle的类,它可以帮助我创建带边框或不带边框、具有不同笔划或填充颜色等的三角形。该类在故事板中是可设计的,并且它的一些属性定义为IBInspectable 目前,在我的xib文件中,我使用这个三角形视图,并通过IB设置其可检查属性。这真的很酷很方便。。。因此,如果我查看xib,我将在其他视图中看到三角形视图 所以,让我们更进一步。为了使用这个XibOwn

当前设置

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

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

所以,让我们更进一步。为了使用这个
XibOwnerClass
,我将
UIView
元素拖到情节提要中,并将其自定义类更改为
XibOwnerClass
,这样我就可以获得特定于
XibOwnerClass
的可设计属性。因此,我可以在
IB
中设置所有内容,当我运行应用程序时,所有内容都正常工作

问题

即使这样做有效,我想知道是否有一种方法,将多个视图(类
XibOwnerClass
)拖到情节提要上,并能够通过Interface Builder单独配置所有视图

当前,当我拖动
UIView
并将其自定义类更改为
XibOwnerClass
时,我什么也看不到。我的意思是,视图就在那里,它有它的标准属性+可检查属性。但是在这个新视图中,我看不到
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加载,则不需要它(因为它没有执行)。但是,在设计时可能需要这样做?

当您不共享类代码时,无法真正说明出了什么问题。但我猜您没有使用PrepareForPrinterFaceBuilder。在XibOwnerClass中,覆盖PrepareForPrinterFaceBuilder并调用其中的视图设置,例如更改背景颜色等

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

}

好的,我已经解决了。事实证明,我不应该使用主Bundle,而应该使用该类的Bundle,如前面所述

下面是代码:

NSBundle *bundle = [NSBundle bundleForClass:[self class]];
@Mohammadalijf的答案大体上是正确的。这不是解决我问题的直接办法。但后来,当我修复bundle这个东西时,我像他说的那样使用prepareForInterfaceBuilder,并在那个里初始化东西,以便在设计时一切都可用


还可以找到一些与所有这些相关的有用信息。

我将用一些代码更新我的问题。而且,在我的例子中,这个方法从未执行过(我已经设置了一个断点)。请注意,我在IB中看到了XibOwnerClass的可检查属性。我只是在实际的xib中看不到任何内容。啊,这个方法只在设计时调用,而不是在构建时调用。无论如何,我看不出有什么不同。目前,我什么也看不到。这就像我添加了普通视图+可检查属性(在属性检查器中)。看不到任何内容。它现在起作用了,我也做了回答。谢谢你的回答。你得到了我的支持票,因为这当然是解决我问题的一个缺失部分。