objccn 学习笔记_更轻量的 View Controllers

非常感谢 objccn 的各位老师们

2.  更轻量的 View Controllers


把 Data Source 和其他 Protocols 分离出来

把UITableViewDataSource的代码提取出来放到一个单独的类中,是为 view controller瘦身的强大技术之一。

现在你不用担心把一个 index path 映射到数组中的位置了,每次你想把这个数组显示到一个 table view 中时,你都可以复用这些代码。

这样的好处在于,你可以单独测试这个类,再也不用写第二遍。该原则同样适用于数组之外的其他对象。


将业务逻辑移到 Model 中

view controller中的示例代码,用来查找一个用户的目前的优先事项的列表:

既然是用户的优先列表,所以可以把相应的业务逻辑放到User的Categroy中。


创建 Store 类

Store 对象会关心数据加载、缓存和设置数据栈。它也经常被称为服务层或者仓库


把网络请求逻辑移到 Model 层


把 View 代码移到 View 层

xib是为了一个cell定制的,所以不需要用到file‘s owner。


3.  整洁的 Table View 代码


Table View Controllers 的特性

一个特别的好处是它支持 Apple 实现的“下拉刷新”,现在最好的使用UIRefreshCon的方式是在TableVC中,可以在别处,但iOS更新就不行了。


Table View Controllers 的限制

view永远都是一个tableView,所以想要加功能就不行了。代码和xib好迁移,是storyboards就麻烦了。


使用Child View Controllers 是更好的选择

(1) addchildVC

(2) addSubView

需要在父子类之间建立消息传递。

用delegate最佳实践。


分离关注点(Separating Concerns)


搭建 Model 对象和 Cells 之间的桥梁

显示的 model 层中的数据传到 view 层中去显示

一般在cellForRowAtIndexPath中拿cell,data,然后赋值,这样暴露了cell的设计。把数据传入cell的Category来设置。


让 Cells 可复用

有时多种 model 对象需要用同一类型的 cell 来表示,这种情况下,我们可以进一步让 cell 可以复用。首先,我们给 cell 定义一个 protocol,需要用这个 cell 显示的对象必须遵循这个 protocol。然后简单修改 category 中的设置方法,让它可以接受遵循这个 protocol 的任何对象。这些简单的步骤让 cell 和任何特殊的 model 对象之间得以解耦,让它可适应不同的数据类型。


在 Cell 内部控制 Cell 的状态

高亮状态下cell的改变,应该移动cell中处理,不对外界暴露cell的设计。


控制多个 Cell 类型

简单判断



实例代码:

photodata.bin

用于归档出用户数据


Store服务层或者仓库

定义标准的两个初始化方法(类和实例),都会触发readArchive,用NSKeyedUnarchiver解析出photos和users。

sorted方法用photo的创建时间排序。


Photo

实现NSCoder协议两方法用于归档

调整rating


User   类似


PhotosVC:

(1) 初始化TableView  ---  Model和DataSource封装方法,VC只负责调用方法,协调关系

用block建立cellphoto的联系

用app的delegate初始化store(从本地bin解析出users&photos)并排序返回photos

blockphotos初始化VC的DataSource(这个block才知道是什么样的cell,DataSou并不知道,所以DataSou可复用)

注册cell,用于复用。

(2) 处理点击cell

初始化PhotoVC,并传递选中photo

PhotoCell / Category(cell与item具体关联方法)

初始化和高亮阴影处理,分类用于处理与数据的关联。(降低耦合)


ArrayDataSource --- 提供 cell 和 item  -->PhotosVC -(1)

(1) 通过photos & 回调block初始化

(2) 当前展示cell 和 响应 item回调VC中block,建立关联。

PhotoVC ---  界面和child -->PhotosVC -(2)

(1) 根据传递图片更新界面

(2) 初始化DetailsVC(TableView),传递图片,设置delegate(通过key初始化DetailVC)

本文实践:addChildVCaddSubView


DetailsVC

(1) 初始化各种设置

(1.1) 各种DataSource -- 通过KVC(可以拿方法返回值)拿值,区分两种cell(ratingCell 和 Style2Cell)

(2) 点击cell -- 回调delegate(PhotoVC)

RatingCell-->DetailsVC (1.1)

nib初始化,重写set方法(updateRating)(拿每个星星设置响应alpha)

DetailVC   -->DetailsVC (3)

navTitle


Tips:

"this class is not key value coding-compliant for the key ..."问题的解决

一般此问题 都是由interface build与代码中IBOutlet的连接所引起的。

可能是在代码中对iboutlet的名称进行了修改,导致interface build中的连接实效。


IBOutlet连接会出key-value not compliant问题,查看"show the Connections inspector",看有没有怪异的连接。


appDelegate中的store是只读属性,重写只读属性的getter方法,自动合成会失效,所以@synthesize手动合成,使_store可用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容