iOS中从加载的xib中得到的控件为空的问题

1.如果使用代码的方式创建控件,那么在创建时一定会调用initWithFrame:方法;如果使用xib/storyboard方式创建控件,那么在创建时一定会调用initWithCoder:方法。

2.initWithCoder:里面访问属性,比如self.button,会发现它是nil的,因为此时自定义控件正在初始化,self.button可能还未赋值(self.button是一个IBOutlet,IBOutlet本质上就相当于Xcode找到这个对应的属性,然后UIButton button = … , [self.view addSubview: button]这种操作,而这一切的操作都是相当于在CYLViewview = [[CYLView alloc] initWithCoder: nil]方法之后执行的。上面的代码就相当于用代码的方式实现Xcode在storyboard中加载CYLView),所以如果在这个方法中进行初始化操作是可能会失败的。

3.所以建议在awakeFromNib方法中进行初始化的额外操作。因为awakeFromNib是在初始化完成后调用,所以在这个方法里面访问属性(IBOutlet)就可以保证不为nil。

4.

通过xib的方式创建的自定义控件,需要设置IBOutlet属性,虽然会调用initWithCoder:方法,但是调用这个的方法的时候IBOutlet属性还未设置好,所以在这个方法中访问属性将会是nil。而在awakeFromNib中,IBOutlet已经初始化完毕,所以在这个方法中初始化不会失败。

如果通过initWithFrame:方法,说明是通过代码创建的自定义控件,它的属性并不是IBOutlet的,所以不存在未完成IBOutlet的属性未初始化完这种情况。所以在initWithFrame:方法中访问一些属性是没有问题的。但是应该注意,如果是通过init方法创建的自定义控件也会调用initWithFrame:方法,但是此时的self.frame是没有被赋值的(在掉用这个方法的时候并没有设置控件的大小),如果这种情况下使用self.frame是没有值的。注意这种情况。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值