一、刚才我们已经做到这个状态了
1.刚才我们做到这里了,就是文字可以显示出来了,
基本数据给大家加载了,然后我们再把这个美化一下,再把这个时间处理一下,
2.咱们先把它这个效果稍微美化一下吧,怎么美化呢,来看一下,
首先,我们看一下示例程序,实际程序,中间是没有这个分割线的吧,
怎么取消这个分割线呢,
是不是UITableView,有一个属性,叫做separatorStyle啊,
分割线的样式,None,是不是就没有分割线了,
找到控制器,在控制器的viewDidLoad里面,
self点什么,tableView,这里能点儿出来tableView吗,点儿不出来,表示什么,需要拖线吧,拖线用一个属性来引用啊,
这样是不是就取消掉分割线了,
分割线没有了,
3.然后我们再看一下,这个UITableView是不是有个背景色啊,
这个背景色,灰色的一个背景色吧,来,给它设个背景色,
这个背景色,用(236,236,236),
//设置UITableView的背景色,怎么设置
self.tableView.backgroundColor =
//注意,这个backgroundColor,它是一个简单的红色、蓝色、这个预定义的颜色吗,不是,是一个236组成的颜色,(236,236,236)
//这时候,我们得用哪个,UIColor colorWithRed:(CGFloat) green:(CGFloat) blue:(CGFloat) alpha:(CGFloat)
//吧
//ColorWithRGB吧,注意,ColorWithRGB这个地方,我们是不是得给它三个值,我们说,每一个颜色,是不是都是0到255的一个颜色啊,
//这个地方,我们不能直接写个236,
//不要这么写,写个236.0
//或者直接写一个236 / 255.0
//这样的话,每一个颜色是不是都是一个百分比,这里都是一个百分比,不是一个写死的颜色,green也是一个百分比,236 / 255.0,blue也是一个百分比,236 / 255.0,后面这个alpha,是否透明,我们这里不透明,是1.0
但是,看到背景颜色了吗,
没有,滚一下,看到了吗,
看到了吧,后面,但是当有单元格的时候,看不到这个背景颜色,
为了能有单元格的时候,也能看到这个背景颜色,所以说,我们把单元格的背景色,给它设成一个没有背景色,
把单元格的背景颜色,设成clearColor,
4.修改单元格的背景颜色,
找到我们这个单元格,
这是我们的单元格吧,
单元格,在创建好这个单元格的时候,设置单元格的背景颜色,
怎么设置呢,self是不是单元格自己啊
self.backgroundColor =
self.backgroundColor = [UIColor clearColor ] ;
看到背景色了吗,
6.现在每一行,一点,是不是高亮显示了,
不想要这个效果,是不是让行不允许被选中吧,怎么做,
也得设置UITableView,让它的行不允许被选中,
找到控制器,找到viewDidLoad,
//设置UITableView的行不允许被选中
self.tableView.allowsSelection = NO;
5.现在每一条消息的发送时间,是不是都显示出来了,
但是,事实上,看一下示例程序
你发第一个消息的时候,有时间, 第二个,有时间,第三个,有时间,第四个,有时间,第五个、第六个,和第四个,是不是都是在8点07分发的,同一分钟发了三个消息,或者说你们一直在聊,这个时候,这个时间就不需要显示了,
当下一条消息的发送时间和上一条消息的发送时间一样的时候,是不是吓一条消息的发送时间,就不显示了,
那么这个思路该怎么实现呢,我们要的是当我们下一个消息、当前这一条消息发送时间,如果和上一条消息的发送时间一样了,那么这个时候,当前这条消息的发送时间,是不是就不显示了,
找到我们自定义单元格里面,设置数据的时候,
这里设置时间的时候,可以判断
当前这个消息的时间,和上一个消息的时间,是不是一样,
如果一样,就隐藏当前这个Label,如果不一样,就显示这个Label,
在这里,我们通过这个message.tIme,可以拿到当前这个消息的时间,但是,你在这里能拿到上一条消息的时间吗,在这里单元格里面,是不是只能拿到当前这个数据模型啊,
拿不到上一个单元格的数据模型,
所以说,我们解决办法就是,在懒加载的时候,判断当前这个单元格的、这条消息的发送时间,和上一条消息的发送时间,是不是一样,在那个地方判断,因为我们只有在懒加载的时候
只有在懒加载的时候,我们是不是可以拿到当前这个数据模型
同时,也可以拿到这个arrayModels .lastObject,
也能拿到它上一条数据模型吧,
只有在懒加载的时候,才能拿到当前的数据模型,和上一条数据模型,
但是,你在懒加载里面,是可以拿到这两个数据模型,你把这个数据模型,判断,作一个判断,当前这个数据模型.time,和上一条数据模型.time,是否一致,如果一致的话,你是不是得把这个值给记录下来啊,
是否一致,你把这个BOOL得记录下来,
记录下来以后,然后,在单元格这个地方,
你就可以判断,这个BOOL类型的值,然后,决定这个单元格是否是隐藏,决定这个lblTime这个Label,是不是需要显示吧,
所以说,我们的基本思路就是:
1)在懒加载的时候,判断当前这个模型的时间,是不是和上一个模型的时间,是否一致,
注意看一下,我们这里判断一下,
//判断当前模型的消息发送时间,是否和上一个模型的消息发送时间一致,
如果一致,做个标记
if(condition),注意,当前模型,这是不是当前的数据模型啊,当前数据模型,有一个time,
if(model.time
当前数据模型,有一个time,is,因为它
因为它是一个字符串,对吧,字符串,能直接用等号判断吗,
等号是判断对象地址,是否一样吧,
怎么判断两个字符串是否一样,isEqualToString吧,
和谁呢
和上一个模型的时间,怎么获取上一个模型,
//获取上一个数据模型,
CZMessage
获取上一个数据模型,
CZMessage *lastMessage =
CZMessage *lastMessage = arrayModels
CZMessage *lastMessage = arrayModels lastObject
是不是获取上一个的一个frame模型了,
CZMessage *lastMessage = [arrayModels lastObject];
获取上一个的一个frame模型了,“点”什么,“点”message,
为什么“点”不出来,或者直接调message
这是不是就是获取
这是不是就是获取上一个frame模型里面的这个message对象了,
OK,这是不是有一个警告,
告诉你指针类型不兼容吧,
指针类型不兼容,
这个怎么办,是不是强转一下,
CZMessage *lastMessage = (CZMessage *)[[arrayModels lastObject] message];
注意看,为什么是最后啊,因为我,大家是不是认为,lastObject,是不是获取当前最后一个模型,我现在是,当我要一个新模型的时候,这里创建一个模型对象,
1)首先,创建一个新的模型对象,数据模型对象,
2)然后,创建一个新的frame模型对象,
3)然后,把这个数据模型,设置给这个frame模型,
4)然后,在这句话的时候,才是把刚刚创建的frame模型加到这个集合里面,
也就是说,在你没有执行这句话的时候,当前集合里面,最后一个对象,是不是就是上一条模型,
所以说,这就是lastObject是拿到当前上一条模型,
上一个模型,因为新的模型,还没加进来呢,
这是不是最新的模型,modelFrame,当执行到这句话的时候,
[arrayModels addObject:modelFrame];
最新的模型,才加进来了,
所以说,在没有执行这句话的时候,这个集合中的lastObject,就是上一个模型,这才是当前最新的模型呢,modelFrame,
所以说,我们这里,拿到上一个模型中的数据模型,
CZMessage *lastMessage = (CZMessage *)[[arrayModels lastObject ] message];
然后呢,这个数据模型,什么,lastMessage.time,
lastMessage.time,判断,就是
判断,就是上一个模型的发送时间,和当前的发送时间是不是一致,
1)如果一致,是不是要做一个标记,这个标记,做到哪儿呢,
这个标记,我就做到这个数据模型里面,
注意,我在数据模型里面,
我在数据模型里面,这个时候,再加一个属性,
//用来记录是否需要显示“时间Label“
//那么,这个就是一个BOOL值,是否,就是hideTime
//hideTime,是否需要隐藏时间吧,
//注意,我把这个是否需要隐藏时间,把它写到了什么里面,是不是把它写到了我们这个CZMessage数据模型里面吧,
//好,然后在控制器里面,怎么写呢,
//我这里写,如果说,当前这个模型的时间,和上一条记录的模型的时间,是一样的,我就让当前这个数据模型的hideTime = YES
//是不是让它等于YES啊,
2)否则,就让它等于什么,NO吧,
else {
model.hideTime = NO;
}
但是,这个是不是不写也行啊,
因为我们这个模型,默认情况下,是不是BOOL类型,就是NO啊,
所以这个,是可以不写的,
好,那么这就是我们在懒加载的时候,根据当前模型的时间,和上一条数据模型的时间,判断是不是应该隐藏当前Label,
既然你在这个模型中,都有这个标记了,
所以说,接下来,在我们自定义单元格里面,
在这个地方,我们就可以直接让当前单元格的这个
时间Label的hidden,等于数据模型里面的
self.lblTime.hidden = message.hideTime;
如果说,当前这里是需要隐藏时间,它返回是不是YES啊,
YES给了hidden,当前Label是不是隐藏了,
如果当前不需要隐藏,hideTime,是不是NO,NO给了hidden ,当前Label是不是显示出来了,
明白了吗,
然后我们再运行的时候,看一下是不是每个时间都显示出来了,
看一下,这个时间显示了吗,是不是第一个这个时间有,这个时间和这个时间没有显示啊,
9.既然这一条消息的时间Label都没有显示,这儿的距离是不是应该小一些啊,
但是现在没有显示时间,距离是不是还是很大,
也就是说,计算这个正文的Label,计算正文的坐标,计算正文和这个icon坐标的时候,是不是还是把那个时间的坐标给它算上了,
所以说,我们还得改一下,在计算这个正文和这个icon的Y值的时候,是不是不要,如果说这个Label,如果说这个时间隐藏了,是不是就不要根据它的时间Label来算了,
来看一下,把这个间距再调一下,间距是不是在我们frame模型里面,
在这里来设置的吧,
OK,我们这里就是计算时间Label,
我们可以这么来写,if(
如果,当前这个数据模型“点”hideTime
如果需要隐藏的话,
if(message.hideTime){
//statement;
}
如果它不需要隐藏,如果当前时间Label不需要隐藏,
if(!message.hideTime){
//statement;
}
如果当前时间Label不需要隐藏,那么,此时,你再给它算一下这个frame的值,
_timeFrame = CGRectMake(timeX, timeY,timeW,timeH);
if(!message.hideTime){
_timeFrame = CGRectMaek(timeX, timeY,timeW,timeH);
}
如果说,当前时间Label需要隐藏,这个时候,还有必要计算它的frame值吗,是不是不需要算frame值了,
既然你frame值不需要算,后面根据frame,算出来值,是不是都是0了,
//如果需要显示时间Label,那么再计算时间Label的frame,如果不需要显示时间Label,就不算它的frame了,既然你都没算它的frame,那么根据frame,拿到的这个Y值,最大的Y值,最大的X值,是不是始终都是0,
运行看看,
来,我们看怎么给它算一下,我把这个时间Label,给它设置一个背景色吧,
给它截个图看一下,
这是不是我们现在这个情况啊,
这是我们现在这个情况,给它保存一个图片,
然后,我把这句话再,
这句话,拷出来,
_timeFrame = CGRectMake(timeX, timeY,timeW,timeH);
是不是没啥变化啊,都没变化哈,
来,证明咱们这儿,是不是没有起作用,
我们这里,是不是显示时间,是不是这么给它算的啊,
如果这么写不行的话,那我就不这么写了,
我先把这个注释掉啊,
我下面这么来做,无论你这个Label是不是需要显示,Label这个值,我正常给它计算,
然后,下面计算头像的时候,这个Y值,我在这里来给它算Y值,
如果说,当前message.hideTime,
if(message.hideTime){
//如果它需要隐藏时间的话,如果说时间Label需要被隐藏的话,
//这个时候,我就让iconY = 0;
iconY = 0;
}
这样的话,头像的Y值,是不是就是根据
这样的话,头像的Y值,是不是就是根据0来算的了,
既然头像的Y值,是0,那么正文的Y值,是不是也是根据头像的Y值来算的,
我刚才本来我想的是,如果说这个时间Label,如果要是不需要隐藏的话,我就来计算时间Label的frame值,
如果,时间Label需要隐藏,我就不计算时间Label的frame值,
然后呢,咱们刚才试了一下,好像是没有什么效果,
那么如果没有什么效果,我就这么来算,
如果说,当前这个时间Label需要被隐藏,
如果说,时间Label不隐藏,那么我这个icon的Y值,是不是就等于时间Label最大的Y值,加一个margin啊,
如果这个时间Label需要隐藏,这个时候,就没有时间Label,那么我们这个时候,icon的Y值,就等于紧贴住我们单元格的Y值啊,
紧贴住单元格内边距,Y值就等于0了,
再运行看一下,
如果这样不行的话,就是咱们刚才哪儿写的不对,
这时候,是还不行吧,
这时候还不行,肯定是咱们刚才哪儿写错了,证明就不是刚才这个写错了的问题,
来,看一下,咱们是哪里有问题了,
我们看一下,刚才是不是设置上有问题,找到控制器的懒加载这里,
1)首先,创建一个新的数据模型,
2)新的模型里面,这里,拿到了这个frame模型,
3)计算,让它的hideTime等于YES,
这个时候,咱们在单元格这个地方,咱们打印一下这个hideTime吧,
不在这里打印,咱们在这个frame里面,
我知道哪儿错了,大家知道哪儿错了吗,看这里,
找到控制器的懒加载这里,
我刚才,这是不是那个数据模型的set方法,
数据模型的set方法,在这个地方,按住command键,点message,跳到下面这个地方,
在这个地方,
在这个地方,我是不是要使用这个数据模型里面这个hideTime这个属性吧,
要使用数据模型的这个hideTime这个属性,
但是我这个hideTime,是在什么地方算出来的,
是不是在控制器里面,是不是在你设置完以后,是不是在这里给它赋的值啊,
明白这个错误了吗,我是不是应该把这句话怎么办,把这两句话,调整到,
调整到它前面啊,
是不是应该调整到这个地方啊,
因为我是在刚才,我这里是不是我们这个set方法啊,
我们这里是把数据模型,设置给这个frame模型,
是在这里计算的,我们应该在执行set方法之前,是不是就应该为这个模型的hideTime赋值,
应该在执行set方法之前,就给hideTime这个属性赋值,
来,我们把这个干掉,
刚才咱们这么写,其实是没有错的,
解开注释,
这个是不是就不需要了,
下面这个是不是也不需要了,