为什么自定义xib需要UIView属性

时间:2015-11-05 19:16:44

标签: ios objective-c uiview

我按照此处概述的教程在视图控制器中加载自定义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

2 个答案:

答案 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中创建的任何内容都不会加载程序initloadNibNamed从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
}