在故事板中显示从 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。
当前设置
我有一个 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。