• 自定义控件时,初始化的注意事项


    重写构造方法

    init方法内,只负责添加子控件,不要设置frame,因为这里的frame初始化值为0
    (这里用init方法不合适,因为如果将创建时,不用下图中注释的方法,而用另一种方法initWithFrame,就不会调用init方法,紧接着结果导致没有创建子控件
     
    解决方法:重写initWithFrame: 方法
    但如果这样重写过后,且不调用initWithFrame: 这个方法会有影响吗?不会,依然会实现.因为init方法内部会自动调用initWithFrame:这个方法,所以以后自定义方法,建议自定义initWithXXX方法)
    通过xib或者storyboard来创建的控件不会调用这个initWithFrame方法,当用到alloc init创建控件对象,或者直接使用initWithFrame方法时会调用initWithFrame这个方法.其它时候会调用这个方法
    如果这个控件不是通过xib storyboard创建,初始化肯定会调用这个方法initWithFrame:
    如果这个控件通过xib或storyboard创建,初始化肯定会调用这个方法initWithCoder:,且初始化完毕后肯定会调用awakeFromNib:

    初始化完毕,属性才会有值
    这也是为什么下图结果为{{0, 0},{0 , 0}};

    设置子控件的frame,用苹果提供的一个方法
    这个方法会保证frame里面有值再调用
    当前控件的尺寸(size)发生改变的时候就会调用,这只是一种场合,当你一调用这个创建的自定义View,就会调用这个方法
    layoutSubview是很有价值的东西,它会让子控件自适应父控件
    [super layoutSubviews]
    父类它在这个方法里面做了一些重要的事情,如果不写,cell自带的子控件布局可能不对
    在类扩展中添加属性
    重写set方法:在set方法中取出模型属性,给对应的子控件赋值
    这里的_shop = shop,可以不写,但建议这样写,因为其它方法中可能用到属性shop,到时候可以直接拿来用
  • 相关阅读:
    网站安全配置Nginx防止网站被攻击
    JAVA程序打包方法-挺好
    Kettle6.1连接MongoDB报错
    基于Rancher搭建Kubernetes
    Tomcat性能调优实战
    const int * 和 int * const 傻傻分不清楚
    洛谷P1028数的计算
    【转】sizeof()用法总结
    百练4103:踩方格(DFS)
    百练2815:城堡问题(DFS)
  • 原文地址:https://www.cnblogs.com/qiling/p/4898668.html
Copyright © 2020-2023  润新知