美文网首页
init注意

init注意

作者: SayFarewell123 | 来源:发表于2017-07-23 17:53 被阅读0次

    当用纯代码调用init方法创建对象时,会调用initWithFrame方法,再调用init方法。

    为什么要在initWithFrame:方法而不是在init方法?
    因为使用纯代码的方式创建自定义类,在以后使用的时候可能使用init方法创建,也有可能使用initWithFrame:方法创建,但是无论哪种方式,最后都会调用到initWithFrame:方法。在这个方法中创建子控件,可以保证无论哪种方式都可以成功创建。
    这里有一点需要特别注意:
    千万不能像下面这样自定义类,否则,如果你使用init方法初始化,那么,因为setUI方法会被调用两次,所以会加入两次UI控件。

    - (instancetype)init
    {
        self = [super init];
        if (self) {
            [self setUI]; //
        }
        return self;
    }
    
    - (instancetype)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            [self setUI];//
        }
        return self;
    }
    
    - (void)setUI
    {
        UILabel* titleLabel = ({
            UILabel* label = [[UILabel alloc]init];
            label.text = @"风速";
            label.textColor = [UIColor whiteColor];
            label.font = [UIFont systemFontOfSize:16];
            [self addSubview:label];
            [label mas_makeConstraints:^(MASConstraintMaker *make) {
                make.left.mas_equalTo(10);
                make.top.mas_equalTo(10);
            }];
    
            label;
        });
    
        _titleLabel = titleLabel;
    
        UIView* lineView = ({
            UIView* view = [[UIView alloc]init];
            view.backgroundColor = [UIColor whiteColor];
            [self addSubview:view];
            [view mas_makeConstraints:^(MASConstraintMaker *make) {
                make.height.mas_equalTo(1);
                make.left.mas_equalTo(10);
                make.right.equalTo(self.mas_right).offset(-10);
                make.centerY.equalTo(titleLabel.mas_bottom).offset(0);
    //            make.bottom.equalTo(titleLabel.mas_bottom).offset(1);
            }];
    
            view;
        });
    }
    

    相关文章

      网友评论

          本文标题:init注意

          本文链接:https://www.haomeiwen.com/subject/yypmkxtx.html