您的位置:首页 > 移动开发 > IOS开发

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

2016-08-18 18:10 253 查看
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
是没有值的。注意这种情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: