• 【微博-自定义Cell-创建子控件 Objective-C语言】


    一、自定义Cell

    自定义Cell

    1.既然我们要自定义Cell,这个自定义Cell,属于MVC哪个部分,

    这个Cell类,属于MVC哪个部分,

    Model、Controller、还是View,

    View吧,

    所以说,应该在这里去新建一个类,

    类
    新建

    在这里去新建一个类,右键,New File,

    右键
    这个类

    这个类,它是谁,UITableViewCell吧,

    Cell

    这个是不是我们微博这个Cell吧,

    微博

    所以说,WeiboCell,点Next,

    这样的话, 我们是不是建了一个类,用来描述单元格,

    类

    新建完以后,是不是自动生成这些方法了,

    然后,我们新建好这个Cell以后,既然已经有自定义Cell了,

    Cell

    所以说,这个地方,还需要用它这个Cell吗,

    cell

    是不是不要用这个Cell了,

    OK,换成我们自己的Cell,

    换成我们自己的Cell

    这里也换成我们自己的Cell,

    Cell

    但是,换成我们自己的Cell以后,能行吗,

    不行,为什么,没有导入头文件吧,

    导入头文件,import “CZWeiboCell.h”

    微博

    然后,再找到我们这个数据源方法,

    然后,注意看,虽然,这里换成了我们这个自定义Cell,

    Cell

    但是,这么写,创建好这个Cell,和原来系统默认的Cell,一样吗,

    是不是一样的,因为你这里,虽然自己定义了一个Cell,

    但是这个Cell中,是不是什么都没写吧,

    什么都没写,它和系统默认的Cell,是不是一样的,

    那么,我现在希望的是,当这个Cell,一旦创建好以后,这个Cell里面,就会自动有那5个子控件,

    我希望这个Cell一创建好,里面就自动就有5个子控件,

    既然,你希望一创建好,就有5个子控件,所以说,我们是不是得重写一下这个Cell的initWithStyle,这个方法啊,

    initWithStyle

    在这个initWithStyle方法里面,我们是不是要给它添加5个子控件,

    好,我们试一下,

    4.重写initWithStyle,方法,

    在这个方法当中,当我们这个Cell,一旦创建好以后,默认首先先给它创建5个子控件,

    示例程序

    示例程序先给大家截个图看一下,

    注意看,因为,我当前,每一个单元格里面,是不是有5个子控件,

    一个、两个、三个、四个、五个,

    子控件

    每一个单元格里面,有5个子控件,

    但是,有人说,有的单元格,有4个子控件啊,有的有5个,没关系,我们按照最多的来创建,

    那么,如果说,这个只有4个子控件,我让那个图片框不显示,是不是就OK了,

    每一行,我都给它创建5个子控件,如果说,这一行,你有这个图片框,我就让它显示,如果没有图片框,我就让它隐藏,就OK了,

    所以说,接下来,我们要自定义,单元格,第一步要做的就是,重写这个自定义单元格里面的initWithStyle,方法,

    在这个方法当中,只要你调这个方法,我先给它创建5个子控件,这5个子控件,创建好就得了,具体说,这5个子控件的位置,frame,数据,这些等会儿再说,我们先保证每个单元格里面,有这5个子控件,好吧,

    咋重写这个initWithStyle方法,

    在CZWeiboCell.m文件中,

    文件

    是不是就直接回车,就可以了,

    回车

    是不是就直接回车,就可以了,

    initWithStyle,这就是重写那个initWithStyle,

    重写

    怎么重写,

    if(self = [super initWithStyle: …]){

    //是不是得调这个,不能调第一个了吧,

    第一个

    是不是得调这个啊,不能调第一个了吧,

    得调这个了,因为你重写的是下面这个方法,

    重写的这个方法,里面也得调这个方法,

    重写

    - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{

    if(self = [super initWithStyle:style reuseIdentifier:reuseIdentifier){

    statements

    }

    }

    这个style,直接用哪里,

    style

    这个style,直接用哪里,

    style

    是不是用这里传过来的style,

    这个reuseIdentifier,用哪个,

    reuseIdentifier

    直接用上面传过来这个,

    重写

    那么,接下来呢,就是,当你重写这个方法的时候,首先,调一下父类的这个方法,保证它原有的这个方法会被调用一次,

    然后,接下来,在这个地方,就是

    //创建5个子控件,

    创建5个子控件

    //当这个创建完毕以后,直接怎么办,直接return这个self,

    重写

    //这是不是就重写这个方法了啊,

    //1.第一个,我们要创建的是什么,

    创建

    //是不是一个头像,昵称,是否是会员,正文,配图,

    正文

    //1.头像

    //2.昵称

    //3.会员

    //4.正文

    //5.配图

    5个

    //这样的话,是不是就有5个了,

    //OK,咱们一个一个来创建,

    //1.头像,是一个什么,UIImageView吧,

    UIImageView *imgViewIcon = [[UIImageView alloc] init];

    头像

    //第一个创建完了,创建完以后,其他的你说frame,你也没设置,内容你也没设置,什么都没设置,现在我就不设置,现在我就只要有控件,就可以了,

    //然后,创建完毕以后,它加到这个Cell里面了吗,这是一个独立的对象,还没有把它加到当前这个Cell里面吧,

    //怎么加,

    self.

    //当前,这是不是就是这个自定义Cell这个类,

    加

    //self,就是这个单元格啊,

    //我们说,要把一个控件加到单元格里面,能直接加吗,

    //最好是把这个内容,加到单元格的什么里面,

    加
    contentView

    //contentView,里面,

    contentView

    [self.contentView addSubview:imgViewIcon];

    加

    //我们上午xib里面,是不是给大家拖了一些子控件,到那个单元格里面,是不是默认是拖到那个contentView,里面吧,

    //不是直接拖到单元格里面吧,

    //所以说,我们写代码的时候,也要这么做,把它加到这个contentView,里面,

    //好,第一个,创建完毕,

    //2.昵称

    //昵称是什么,是不是Label啊,

    UILabel *lblNickName = [[UILabel alloc] init];

    //然后呢,

    [self.contentView addSubview:lblNickName];

    加

    //该会员了吧,

    //3.会员

    //会员,我们直接来个

    UIImage

    //会员,是什么东西,

    会员

    //是否是会员,是不是也是一个图片框,也是一个图片框,所以我们这里也要来一个UIImageView

    UIImageView *imgViewVip = [[UIImageView alloc] init];

    会员

    //好,这样的话,会员也创建好了,

    //4.正文

    //接下来,该正文了吧,

    正文

    //正文,也是个Label吧,

    UILabel *lblText = [[UILabel alloc] init];

    [self.contentView addSubview:lblText];

    正文

    //好,这个Label,是不是有了,

    //5.配图

    //配图,是个什么,也是picture吧,是不是也是UIImageView,

    配图

    UIImageView *imgViewPicture = [[UIImageView alloc] init];

    [self.contentView addSubview:imgViewPicture];

    这样

    //这样的话,当你再调

    调

    //这个时候,当你再调完这个,initWithStyle,以后,

    //默认是不是就给你创建好5个子控件了,

    //这样的话,这5个子控件,就创建好了,

    //好,创建好以后,接下来,我们回到CZTableViewController.m里面,

    回到

    那么,这个时候,当我们再执行完这个方法以后,这里,创建好这个Cell以后,这里是不是已经有5个子控件了,

    创建

    这里面,是不是已经有5个子控件了,有5个子控件以后,接下来,其实非常简单,只要给这个自定义Cell,增加一个weibo,这个属性,把模型赋值给这个属性,以后,我们在这个属性中,把模型里面的数据,赋值给每个子控件,设置好每个子控件的frame,这样的话,是不是就能显示出来了,

    所以说,接下来,我们就该写哪里,

    是不是要给它加一个weibo,这个模型属性,然后,重写一下它的set方法,

    三、好,现在,为自定义Cell,增加一个weibo,这个模型属性,

    增加属性

    1.增加属性,在这里吧,

    这里

    @property(nonatomic,strong)CZWeibo *weibo;

    weibo

    叫什么类型,CZWeibo,吧,

    前面@class CZWeibo;

    weibo

    给它加了一个weibo这个属性,

    加了这个属性以后,这个地方,是不是就能这样赋值了,

    微博

    然后,你要想在赋完值以后,立刻给它设置数据,是不是要重写这个属性的set方法啊,

    2.重写单元格的weibo属性的set方法

    微博

    当我们重写set方法的时候,

    首先,一定要先怎么样一下,先赋值吧,

    _weibo = weibo;

    - (void)setWeibo:(CZWeibo *)Weibo{

    _weibo = weibo;

    }

    赋值完毕以后,其实,现在,只要做两件事儿,

    1)设置当前单元格中的子控件的数据

    2)设置frame

    设置

    当子控件有了数据以后,能显示出来吗,显示不出来,还得设置当前单元格中子控件的frame,

    设置

    现在,当我们创建好一个单元格以后,

    单元格

    里面子控件有了,

    子控件

    子控件的数据有了,子控件的frame有了,

    frame

    这些都有以后,是不是就可以显示出来了,

    所以说,我们接下来,是不是要做这两件事儿,

    对吧,

    四、好,因为我们要设置5个子控件的数据,

    要设置5个子控件的frame,

    所以说,我把设置数据和设置frame,方法,这个代码,是不是可以给它单独提取两个方法,

    1.好,设置数据,怎么设置呢,注意看,

    //设置数据的方法

    设置

    //设置frame的方法

    设置

    2.设置数据的方法,我们可以给它来一个,自己写一个方法,

    - (void)setData{

    }

    设置

    这是不是设置数据吧,

    然后,这里来个setFrame

    - (void)setFrame{

    }

    哦注意看

    哦,注意看,因为我们当前,这是一个控件吧,

    控件

    这是一个控件吧,任何一个控件是不是都继承自UIView,UIView里面是不是有个frame这个属性,任何控件,是不是都能“点”出一个frame属性来,frame属性,是不是本身就有,所以,我们这里改一下吧,叫什么,

    - (void)settingData{

    }

    - (void)settingFrame{

    }

    设置

    然后呢,接下来,我们只要在这里,调一下当前这个单元格的settingData,

    然后呢,调一下当前这个单元格的settingFrame,

    设置

    这样的话,在这个Weibo的set方法里面,

    weibo

    只要把数据设置好,把frame设置好,就能显示出来了,

    3.那么,接下来,我们就实现一下这个settingData和settingFrame方法

    在这个设置数据的方法里面,

    我把刚才那个代码拷一下,

    设置
    当然

    当然,我拷这个代码的主要目的,其实就是为了干什么,

    注释

    是为了拷一下注释,因为这个里面的代码,咱们是用不着的,

    好,那么,接下来,我们是不是一个一个设置数据,就好了,

    好,设置数据,注意听,我们在这个initWithStyle方法里面呢,

    这个控件,是不是是一个局部变量啊,

    局部变量

    你在下面这里,能访问的到吗,

    访问

    访问不到,

    要想在下面也能访问到这些子控件,得怎么办,

    是不是用一些属性来引用它,

    OK,所以说,我们得在这里怎么样,

    延展

    是不是得在类扩展里面

    类扩展

    是不是得在类扩展里面,建一些属性啊,

    类扩展里面建一些属性,

    类扩展

    @interface CZWeiboCell ()

    @property(nonatomic,……

    @end

    注意,我们说,这个本身就是一个UI控件,

    UI控件

    UI控件,如果我们用自己的属性来引用的话,它应该是什么,

    weak

    UI控件,如果我们用自己的属性来引用的话,它应该是什么,

    weak,

    @property(nonatomic,weak)UIImageView *imgViewIcon;

    引用

    第一个有了,这是第一个吧,

    一共几个,5个吧,

    是不是一共有5个,

    一、二、三、四、五

    五个

    我拷五个,

    第二个是什么,Label,

    第三个是什么,imageView,

    第四个是什么,Label,

    第五个是什么,imageView,

    设置

    我改一下名字,

    改

    这样的话,你这里虽然有五个控件,有五个属性,

    但是,这五个属性,和这里的子控件,关联起来了吗,

    关联

    没有吧,所以说,每一个后面,再加一句,什么,

    self.imgViewIcon = imgViewIcon;

    赋值
    赋值

    self.lblNickName = lblNickName;

    self.imgViewVip = imgViewVip;

    self.lblText = lblText;

    self.imgViewPicture = imgViewPicture;

    这是不是把每一个控件,赋值给对应的属性啊,

    设置

    这样的话,当我们在这个重写init方法里面,不仅创建好了五个子控件,

    同时

    同时,每一个子控件是不是也都用一个属性引用起来了,

    接下来,我们在后面,就可以使用这几个属性,

    属性

    就可以,相当于是使用那几个控件了吧,

    好,那么,接下来,我们在这里,在这里设置头像的时候,是不是就可以一个一个的设置了,

    一个一个设置

    接下来,大家休息一下吧,等会儿我们给大家设置一下数据

  • 相关阅读:
    物联网AI MicroPython传感器学习 之 GPS户外定位模块
    如何将firebase应用转为supabase应用(之一)
    day01(Flume)
    【OpenCV】红绿灯检测C++Demo实现
    盘点Go中的开发神器
    Mac 运行 C/C++代码
    CA(openssl)
    vue3 中 setup 函数、defineComponent 函数 和 script 标签上的 setup
    sklearn(一)
    A-Level商务例题解析及练习Sources of finance
  • 原文地址:https://blog.csdn.net/madoca/article/details/130804151