-
【微博-自定义Cell-创建子控件 Objective-C语言】
一、自定义Cell
1.既然我们要自定义Cell,这个自定义Cell,属于MVC哪个部分,
这个Cell类,属于MVC哪个部分,
Model、Controller、还是View,
View吧,
所以说,应该在这里去新建一个类,
在这里去新建一个类,右键,New File,
这个类,它是谁,UITableViewCell吧,
这个是不是我们微博这个Cell吧,
所以说,WeiboCell,点Next,
这样的话, 我们是不是建了一个类,用来描述单元格,
新建完以后,是不是自动生成这些方法了,
然后,我们新建好这个Cell以后,既然已经有自定义Cell了,
所以说,这个地方,还需要用它这个Cell吗,
是不是不要用这个Cell了,
OK,换成我们自己的Cell,
这里也换成我们自己的Cell,
但是,换成我们自己的Cell以后,能行吗,
不行,为什么,没有导入头文件吧,
导入头文件,import “CZWeiboCell.h”
然后,再找到我们这个数据源方法,
然后,注意看,虽然,这里换成了我们这个自定义Cell,
但是,这么写,创建好这个Cell,和原来系统默认的Cell,一样吗,
是不是一样的,因为你这里,虽然自己定义了一个Cell,
但是这个Cell中,是不是什么都没写吧,
什么都没写,它和系统默认的Cell,是不是一样的,
那么,我现在希望的是,当这个Cell,一旦创建好以后,这个Cell里面,就会自动有那5个子控件,
我希望这个Cell一创建好,里面就自动就有5个子控件,
既然,你希望一创建好,就有5个子控件,所以说,我们是不是得重写一下这个Cell的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,
这个reuseIdentifier,用哪个,
直接用上面传过来这个,
那么,接下来呢,就是,当你重写这个方法的时候,首先,调一下父类的这个方法,保证它原有的这个方法会被调用一次,
然后,接下来,在这个地方,就是
//创建5个子控件,
//当这个创建完毕以后,直接怎么办,直接return这个self,
//这是不是就重写这个方法了啊,
//1.第一个,我们要创建的是什么,
//是不是一个头像,昵称,是否是会员,正文,配图,
//1.头像
//2.昵称
//3.会员
//4.正文
//5.配图
//这样的话,是不是就有5个了,
//OK,咱们一个一个来创建,
//1.头像,是一个什么,UIImageView吧,
UIImageView *imgViewIcon = [[UIImageView alloc] init];
//第一个创建完了,创建完以后,其他的你说frame,你也没设置,内容你也没设置,什么都没设置,现在我就不设置,现在我就只要有控件,就可以了,
//然后,创建完毕以后,它加到这个Cell里面了吗,这是一个独立的对象,还没有把它加到当前这个Cell里面吧,
//怎么加,
self.
//当前,这是不是就是这个自定义Cell这个类,
//self,就是这个单元格啊,
//我们说,要把一个控件加到单元格里面,能直接加吗,
//最好是把这个内容,加到单元格的什么里面,
//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;
叫什么类型,CZWeibo,吧,
前面@class CZWeibo;
给它加了一个weibo这个属性,
加了这个属性以后,这个地方,是不是就能这样赋值了,
然后,你要想在赋完值以后,立刻给它设置数据,是不是要重写这个属性的set方法啊,
2.重写单元格的weibo属性的set方法
当我们重写set方法的时候,
首先,一定要先怎么样一下,先赋值吧,
_weibo = weibo;
- (void)setWeibo:(CZWeibo *)Weibo{
_weibo = weibo;
}
赋值完毕以后,其实,现在,只要做两件事儿,
1)设置当前单元格中的子控件的数据
2)设置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方法里面,
只要把数据设置好,把frame设置好,就能显示出来了,
3.那么,接下来,我们就实现一下这个settingData和settingFrame方法
在这个设置数据的方法里面,
我把刚才那个代码拷一下,
当然,我拷这个代码的主要目的,其实就是为了干什么,
是为了拷一下注释,因为这个里面的代码,咱们是用不着的,
好,那么,接下来,我们是不是一个一个设置数据,就好了,
好,设置数据,注意听,我们在这个initWithStyle方法里面呢,
这个控件,是不是是一个局部变量啊,
你在下面这里,能访问的到吗,
访问不到,
要想在下面也能访问到这些子控件,得怎么办,
是不是用一些属性来引用它,
OK,所以说,我们得在这里怎么样,
是不是得在类扩展里面
是不是得在类扩展里面,建一些属性啊,
类扩展里面建一些属性,
@interface CZWeiboCell ()
@property(nonatomic,……
@end
注意,我们说,这个本身就是一个UI控件,
UI控件,如果我们用自己的属性来引用的话,它应该是什么,
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