iOS中从加载的xib中得到的控件为空的问题
2016-08-18 18:10
253 查看
1.如果使用代码的方式创建控件,那么在创建时一定会调用
2.在
= … , [self.view addSubview: button]这种操作,而这一切的操作都是相当于在CYLViewview
= [[CYLView alloc] initWithCoder: nil]方法之后执行的。上面的代码就相当于用代码的方式实现Xcode在storyboard中加载CYLView),所以如果在这个方法中进行初始化操作是可能会失败的。
3.所以建议在
4.
通过xib的方式创建的自定义控件,需要设置IBOutlet属性,虽然会调用
如果通过
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是没有值的。注意这种情况。
相关文章推荐
- iOS开发(第三方使用)——百度地图的简单使用(定位与当前位置的显示)
- iOS 开发中的争议(一)
- 多用块枚举,少用for循环
- iOS容易造成循环引用的三种场景,就在你我身边!
- iOS中比较当前日期与指定日期大小
- iOS 到处 ipa包的时候 会有四个选项分别代表什么
- iOS中集成ijkplayer视频直播框架
- IOS工程自动打包并发布脚本实现
- 使用xcode storyboard设置按钮圆角方法
- iOS 可执行文件瘦身方法
- iOS开发运行时总是显示4s的尺寸
- IOS在子线程中使用定时器,将定时器添加至RunLoop中
- 控件 加阴影
- iOS9 适配
- 用RVI方法,对iOS进行抓包
- Xcode界面编辑器 could not insert new outlet connection
- iOS项目冗余资源扫描脚本
- 通知
- label 字体换色
- 环信3.0集成中遇到的那些“坑”