关于创建对象的时候直接init能否实现我们封装的功能呢?
本文是关于自定义控件的补充
这个答案不是确定的:
-
如果是ViewController 各种行的控制器,直接init的时候会就近找到我们所设想,给定的那个类,实现相应的功能和属性
-
如果是UIView 如果 我们封装了一个类 (PageView ) 如果直接init
是不会给我们执行我们所写的那些属性和方法的 即使xib所属类 和 xib文件的类名一模一样 ,都不会因为这些而改变要注意 xib只能通过sb 或者loadNib
才能在创建的时候使用这个方法创建出来我们想要的xib 属性和相应的功能
通过代码创建的控件和通过xib加载过来的 ,完全是两个文派 不要混淆在一起 造成这个想法的误区 ,不要有这种想法
需要通过这种手动的方式去去加载 [[[NSBundle MainBundle ]loadNibName:]lastObject];
- 问题: xib中的控件 我想对它进行控件做一些初始化操作
比如哦背景色改为黑色,在类方法中实现-(instancetype)initWithFrame:frame 但是在运行的时候根本不起作用..
因为通过xib创建控件是通过以下的方式去调用方法的�
[UIView alloc]initWithCoder
因此
:
如果我们想在加载xib 或者sb 里面的 控件时候,自定义的给它一些操作,比如该背景色
我们需要重写的方法不是initWithFrame 而是initWithCoder
initWithCoder里面不会去调用initWithFrame
问题2:
解决了initWithCoder ,现在我们知道了从xib加载控件的时候从initWithcoder
如果我在该方法里面给它设置xib里面的一个控件scrollview的背景色改为红色,为什么nslog 的时候 为null
答案:
我们的代码设置背景色为红色 在initWithcoder里面其实没有起作用是因为 我们的连线还没有生效
就是说,还没有完整的从加载xib控件中醒过来, 这时候就引出来了 awakeFromNib
方法 ,awakeFromNib 说明我已经完成了没有执行代码干扰的一系列操作,在这个方法里面就可以用对所有xib里面的东西进行添加干涉的东西
总结 : 添加创建控件 自定义干涉 只有两个选择 awakeFromNib和initWithFrame
其他的init或者别的都是不靠谱的.
如果我们封装自定义控件的时候最好给定两种方法,我们不知道第三方会用代码或者拖拽控件的方式创建控件
所以我们将initWithFrame 和 awakeFromNib 两种都实现
记住awakeFromNib 是sb或者nib 用来加入自定义控件代码的时候用
网友评论