iOS TableView数据绑定的原则

时间:2022-11-23 17:05:29

数据绑定的原则
  

  如果你在写表视图控制器的子类代码,大部分代码都在 UITableViewDelegte UITableView-DataSource 方法中。我们将注意力聚焦在如何编写简洁的方法代码来解决问题上。cellForRowAtIndexPath 方法中经常会有为每一个表单元的特定 UI 元素设置值的代码。为表单元中 UI 元素设置 值的最佳方法是将代码移到别处。现在应该将它移到哪里呢?这要看你使用的是哪一类自定义表单 元。根据你应用要做到的功能,表视图需要与相关的数据建立联系。

  这种技术通常称为数据绑定(data binding),在 iOS 中并不怎么被重视,至少与 Mac 比较起来是 这样。绑定数据的最好办法是将你的数据模型对象传递到自定义的表视图单元并让其绑定数据。

  我们根据关联数据的方式将表视图单元分为三种类型。第一类是 UITableViewCell 的子类,它 是用来显示特定类型数据的自定义表单元,一般情况下都与应用的特定信息绑定。RSS 阅读器中展示 推送信息的 FeedCell 就是一个例子。

  第二类的作用与苹果公司的 UITableViewCell 实现类似。你创建指定样式的表单元,这些表单 元可以在其他类或工程中用来显示多种类型的数据模型。举个例子,你可以创建像 MyTableViewSwitchCell 这种可以显示标题文本、UISwitch 开关,或像 MyTableViewInputCell 这种可以显示标题文本以及显示数据项 UITextField 文本框的通用类。

  第三类表单元就是UIKit框架提供的原生UITableViewCell。无论是哪一种类型,都要尽量把 数据绑定代码移到表单元自身中。

  下面是第一类的情况,它简单而直观。在 FeedCell 中编写接收模型对象(作为参数)的方法 并设置 Feed 模型对象的值给特定 UI 元素。也就是说,将你的数据绑定代码移到(UITableViewCell 的子类)FeedCell 中。比方说,在 RSS 阅读器应用中,FeedCell 公用方法看起来应该像下面 这样:

FeedCell 中的绑定方法

-(void) bind:(Feed*) feedToBeDisplayed {
self.titleLabel.text = feedToBeDisplayed.text; self.timeStampLabel.text = feedToBeDisplayed.modifiedDateString;

... }

  我们并不在视图控制器数据源方法 cellForRowAtIndexPath 中写代码,而是将其移到了 UITableViewCell 的子类中。这意味着如果之后需要修改表单元的格式(比如要给 Feed 模型对象和 FeedCell 添加作者名信息时),你便可以在那里(一个地方)执行操作了。

  如果你使用系统默认的 UITableViewCell 来显示数据,我推荐把这个绑定方法添加到 UITable- ViewCell 的分类类(category class)上。

  第二种情况,你拥有多个使用同一 UITableViewCell 表单元的模型。我建议创建多个分类类, 每个模型一个;举个例子,创建 UITableViewCell+Feed.h/m 文件以显示推送信息,或是创建 UITableView- Cell+Subscription.h/m 文件以在同一表单元上显示订阅信息。给绑定方法命名的时候需要小心谨慎。如 果分类包含一个重复的方法名称,它将会覆盖前面定义的方法,这种重写的发生是没有定义顺序的。 我建议用 bind<ModelClassName>这样的方式给它们命名,这样更易读和易于理解。比如说像 bindFeed(Feed*)bindSubscription:(Subscription*)这样的命名约定。

  第三类情况,你拥有一个像 MyTableViewSwitchCell 这样的通用自定义表单元。在这种情况 下,你也可以使用之前所说的技术。为通用自定义表视图单元添加分类方法。

  通常,你可能会在多个表和多个视图控制器内重复使用同样的 FeedCell 单元格。将与数据绑定 相关的代码移出表视图控制器(或其他任意通用的视图控制器)可以减少控制器内的代码混乱情况并 简化代码维护工作。