美文网首页iOS开发iOS OC 学习手册编程学习
iOS 创建对象时直接init能否实现封装功能?

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

作者: Dayu大鱼 | 来源:发表于2016-07-22 23:30 被阅读369次

    关于创建对象的时候直接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能否实现封装功能?

      本文链接:https://www.haomeiwen.com/subject/ksoijttx.html