iOS 创建对象时直接init能否实现封装功能?

关于创建对象的时候直接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 用来加入自定义控件代码的时候用

你可能感兴趣的:(iOS 创建对象时直接init能否实现封装功能?)