非常感谢 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建立cell和photo的联系
用app的delegate初始化store(从本地bin解析出users&photos)并排序返回photos。
用block和photos初始化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)
本文实践:addChildVC,addSubView
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可用。