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

Showing a content of a UIView loaded from a xib in a storyboard

当前设置

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

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

所以,让我们更进一步。为了使用此 XibOwnerClass,我将 UIView 元素拖到情节提要中,并将其自定义 class 更改为 XibOwnerClass,因此我获得了针对 [=] 的可设计属性12=]。因此,我可以在 IB 中设置所有内容,当我 运行 应用程序时,一切正常。

问题

即使这可行,我想知道是否有办法将多个视图(class XibOwnerClass)拖到故事板上,并能够单独配置所有视图通过 Interface Builder?

目前,当我拖动 UIView 并将其自定义 class 更改为 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 加载就不需要它(因为它没有被执行)。但也许这在设计时是需要的?

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

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

}

好的,我已经解决了。事实证明,我不应该使用 Main Bundle,而应该像 here 所描述的那样为 class 使用 bundle。

代码如下:

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

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

也可以找到与所有这些相关的一些有用的东西here