UITableViews 是许多 iPhone 和 iPad 应用程序的常用构建块。将它们添加到应用程序中很简单 - 将它们放入 XIB 文件中,连接您的代理和数据源出口,这样您就设置好了...嗯,差不多吧。您将在完成数据源方法的繁琐过程之后。
您写了多少次这样的东西?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *identifier = @"Cell";
// yawn...
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
// don't forget that reuse identifier!
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier] autorelease];
}
// at least extracting this keeps the method tidy...
[self configureCell:cell atIndexPath:indexPath];
return cell;
}
好吧,您可能没有亲手编写它;它可能是为您自动生成的(包含一些方便的占位符以便您填写),但事实是,随着应用程序的发展,这个方法会增长,您就必须在每个表视图控制器中重复它。
要确定表视图应该从哪里获取数据。您是否应该将它存储在视图控制器中的 NSArray 实例变量中?还是一个 NSDictionary?也许直接从一个领域对象上的集合中拉取它?一定有更好的方法。
如果您想检出项目并构建它,请确保首先初始化项目的 git 子模块;它有两个,Kiwi 和 Mocky。
在以类似重复的方式实现大量的 UITableViewDataSource 后,我开始怀疑是否有一种缺失的抽象应该位于领域模型和 UITableView 数据源之间。某种响应于领域事件(例如,接收一条新的推文、删除一个联系人)的东西,这些问题可能是或可能不是用户输入的结果(也许推文来自 Twitter 流 API),并针对此事件发布响应,这些事件适用于 UITableView 语言的:插入了一行、删除了几行等。
这里的所有工作都是基于Java Swing JTable API背后的TableModel接口,但别被Java或Swing这些词吓到。JTable组件与UITableView并不完全相同。它是一个更传统的表格组件,其中行表示对象,列表示属性,单元格显示单个值,但我越看越觉得它可以用作UITableView。
这个项目是对这个概念的探索,希望它能演变成一种一般有用的东西。
通过在TableModel中实现大多数表格更新逻辑,控制器只需通过一种方式或另一种方式重新加载数据表格视图来对这些变化做出响应,就可以独立于UITableView对表格模型代码进行单元测试。SimpleTableViewModelTest测试展示了这一点,使用模拟的事件监听器。
LRTableModel的核心是一系列需要您应用程序实现协议。它们是
这是核心协议,它是UITableView和您领域之间的缺失链接。目的是您的LRTableModel协议实现也将作为您表格视图的数据源。实现可以是通用的(请参阅基于对象数组的SimpleTableModel示例,该示例提供单元测试,可能为抽象表格模型类的基础)-- 事实上,在大多数情况下,可能可以提供一个抽象的协议实现供用户派生类使用--尽管我建议实现一个表模型,该模型表达了您的领域语言,并且实际上是您领域模型的一部分。
提供表格视图单元格的一般模式相同;从池中撤回一个可重用的单元,如果没有一个可用的单元,就创建一个新的单元,用您的领域对象的属性配置它,然后返回它。LRTableModel的抽象实现应该能够通过委托给LRTableModelProvider的实例来封装这种模式,以填补空白 - 创建新单元格、指定重用标识符和配置单元格属性。
这通常由管理UITableView的视图控制器实现,并用于响应该模型触发的事件;这些将是插入、更新、删除、刷新(整个结构或数据集已更改)。事件监听器最简单的事情就是简单地重新加载数据表格视图,但它可以选择对不同类型的事件进行更细粒度的更新,例如动画插入/删除。
项目包含以下示例
基于对象数组的通用实现;此实现提供了单元测试,并可能为某种类型的抽象表模型类提供基础。
所有代码版权所有,属于Luke Redpath 2010,并根据MIT许可提供。