我按照此处概述的教程在视图控制器中加载自定义xib。
xib的类继承自UIView,但也需要属性视图:
@interface MYBannerView : UIView
@property (nonatomic, weak) IBOutlet UIView *view;
@end
我觉得很奇怪它需要这个,因为它在视图中有一个看似多余的视图。这有什么特别的原因吗?
修改
我在这里按照本教程概述了这个:
http://www.maytro.com/2014/04/27/building-reusable-views-with-interface-builder-and-auto-layout.html
答案 0 :(得分:0)
不,您的UIView
子类不需要视图的出口才能正常运行。事实上,使用self
您可以访问视图本身。
教程怎么样:当作者在view A
视图中添加MYViewController's
(让我们这样称呼)时,他将view A
类设置为MYBannerView
。正在运行的应用无法显示任何内容,因为MYBannerView
xib未加载且未替换view A
中的内容。因此,作者在initWithCoder
中加载此xib,使用loadNibNamed:
返回的值设置outlet,并将从MYBannerView
加载的视图添加到view A
。这个过程有点乱,但它确实有效。
答案 1 :(得分:0)
该教程的作者使用视图出口以编程方式初始化MYBannerView
时从xib加载视图
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
NSString *className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];
[self addSubview:self.view];
return self;
}
return nil;
}
在Interface Builder中创建的任何内容都不会加载程序init
。 loadNibNamed
从xib加载UI。
如果要覆盖initWithFrame:
以从xib加载UI元素,则init方法将如下所示:
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame]; // initialize your objects
if (self) {
[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil]; // load your view from IB
}
return self; // return the view with all of the IB UI loaded
}