032-UITableView(3)-iOS笔记

学习目标

1.【理解】QQ界面搭建

2.【理解】通知中心NSNotificationCenter

3.【理解】实现发布信息和自动回复

一、QQ界面搭建

手机QQ聊天软件应该大多数人都接触过,就不细说了,需求是自定义cell搭建手机QQ聊天界面。

分析:顶部、底部是单独UIView控件,中间是tableview。所以可以一眼看出顶部、底部不是在tableview中的,因为他们不会随着tableview而滑动。效果图如下:点击这里查看动态图

032-UITableView(3)-iOS笔记还是和上一篇文章的微博案例一样,先封装数据模型和cell的frame模型。导入素材和plist文件,创建模型类。素材下载地址

032-UITableView(3)-iOS笔记

创建模型类注意:

type建议定义为枚举类型,虽然也不是必须要这样,但是这样看起来必须形象些吧。还有需要定义一个时间是否隐藏的属性,当多条消息时间相同的时候,只显示第一条消息的时间,而隐藏之后消息的时间。我们每天都在用QQ,应该都很熟悉这个了,如下图所示:

032-UITableView(3)-iOS笔记

JFMessage.h

 JFMessage.m

封装好数据模型后再继续封装frame模型,和微博案例类似,frame模型类中有模型对象属性、cell子控件的frame和cell的高度。因为封装frame的最终目的就是为了在创建cell之前计算出cell的高度,而计算cell的高度又必须根据cell子控件的frame来计算。最后提供一个返回frame模型数组的类方法,就可以将懒加载中的部分代码封装到模型类中,减少控制器中的代码量。

JFMessageFrame.h

 JFMessageFrame.m

这里用到了一个方法,不是NSString自带的方法,而是我们给NSString添加的分类。分类的代码如下:

NSString+JFFontSize.h

NSString+JFFontSize.m

封装好数据模型和frame模型后,就可以开始封装cell。方法和微博案例也是类似,只不过需要根据消息发送时间判断时间是否显示。并且要用到一个新的方法来拉升背景图片,从而达到背景图放大而不失真的效果。

 JFMessageCell.h

 JFMessageCell.m

上面用到的拉升图片的方法,是一个自定义的UIImage分类的方法。分类的代码如下:

UIImage+JFImageSize.h

 UIImage+JFImageSize.m

封装好cell后,就可以在控制器调用并展示数据了。首先在Main.storyboard中拖拽好基本界面,并对tableview和textField进行属性连线。

032-UITableView(3)-iOS笔记在控制器中遵守数据源协议、代理协议,并指定当前控制器为tableview的数据源对象、代理对象。并实现对应的方法。需要注意的是这里设置背景图的前提是cell的背景色是clearColor,否则会被cell自带的背景色给覆盖住。

ViewController.m

最终效果图:

032-UITableView(3)-iOS笔记

二、通知中心NSNotificationCenter

通知中心是程序内部提供的消息广播的一种机制。实际上就是一个消息传递者,把接收到的消息,根据内部的一个消息转发表,来将消息转发给需要的对象。通知中心是基于观察者模式的,它允许注册、删除观察者。

一个NSNotificationCenter可以有许多的通知消息NSNotification,对于每一个NSNotification可以有很多的观察者Observer来接收通知。

创建通知中心

一个应用程序内部只有一个通知中心实例对象(单例对象):

发布通知

 注册通知监听器

 取消注册通知监听器

 键盘通知

键盘状态发生改变的时候,系统会发出一些特定的通知

 注册键盘通知监听器

我们经常需要在键盘弹出或者隐藏的时候做一些特定的操作,因此需要监听键盘的状态。让控件器监听系统自动发出的键盘的frame将要发生改变事件,调用控制器的方法进行处理。代码如下:

 键盘通知的额外信息

系统发出键盘通知时,会附带一下跟键盘有关的额外信息(字典),字典常见的key:

 实现键盘监听事件处理

获取键盘的开始和最终的frame,计算出偏移值,让tableView以动画的形式也进行相应的偏移。

通知和代理的区别:

代理 :一对一关系 (1个对象只能告诉另1个对象发生了什么事情)

通知:多对多关系(1个对象能告诉N个对象发生了什么事情, 1个对象能得知N个对象发生了什么事情)

通知和代理的选择:

如果是自定义的操作,一般使用代理。

如果是系统组件事件,就先考虑通知。

三、实现发布信息和自动回复

QQ界面已经搭建完毕,接下来实现键盘的弹出和收起,发布消息和自动回复功能。先设置UITextField的Return Key选项为Send,并勾选Auto-enable Return Key,让发送键在未输入内容的情况下禁止点击。

032-UITableView(3)-iOS笔记

然后创建通知中心单例对象,注册通知监听事件并监听键盘的状态。在键盘弹出后,屏幕内容也跟着向上偏移,在拖动tableview的时候,收起键盘。

ViewController.m

实现发布信息和自动回复功能,监听Send键的点击。当点击键盘上的Send键后创建模型,添加到frame模型数组中,并重新加载tableview中的数据。

ViewController.m

 案例易错总结:

1.注册的监听一定要在对象销毁的时候取消,不然系统还会一直向当前注册监听的对象发送通知,但是对象已经不存在,就会造成野指针的错误。

2.这里不能直接使用UITableViewController,因为当前界面还有其他控件。

3.忘记设置代理对象。

六阿哥

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: