向 TableView 填充数据
问题
想要在 TableView 中填充数据。
方案
创建一个遵循 UITableViewDataSource 协议的对象并把它分配到一个 TableView 实例中,然后通过响应数据源消息给你的 TableView 提供信息。
@Interface TableViewController : UIViewController <UITableViewDataSource> @property (nonatomic, strong) UITableView *myTableView; @end
在视图控制器中用 viewDidLoad 方法可以创建 TableView ,然后将 viewController 设置为 tableView 的数据源。
/* Make sure tableView resize correctly */
self.myTableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.view addSubview: self.myTableView];
}
现在需要确定我们的表视图响应 UITableViewDataSource 协议的 @required 方法,按住键盘上的 command 键,在视图控制器的头文件 UITableViewDataSource 上单击,这将会展示这个协议 @required 修饰的方法。
UITableView 类定义了一个名为 dataSource 的属性,这个非固定类型的对象必须遵循 UITableViewDataSource 协议,每次刷新表格视图,并使用 reloadData 方法重新加载时,这个 TableView 会从其数据源调用各种方法以找出对其填充的数据,一个 TableView 的数据源能够实现三个重要方法,其中2个对每个数据源都要强制执行。
numberOfSectionsInTableView: 此方法允许数据源告知加载到 TableView 中的表的 Section 数。
tableView:numberOfRowsInSection: 此方法告诉视图控制器有多少单元格或者行要加载到每个 Section, Section 个数传递给数据源中的 numberOfRowsInSection 作参数,这个方法在数据源对象中要强制执行。
tableView:cellForRowAtIndexPath: 此方法负责返回作为 TableView 行的 UITableViewCell 类静态实例。这个方法在数据源对象的执行中也是强制性的。
首先,告诉 UITableView 显示3个Section.
if ([tableView isEqual:self.myTableView]) {
result = 3;
}
return result;
}
然后,告诉 UITableView 需要在每个 Section 显示多少行。
if ([tableView isEqual:self.myTableView]) {
switch (section) {
case 0: {
result = 3;
break;
}
case 1: {
result = 5;
break;
}
case 2: {
result = 8;
break;
}
}
}
return result;
}
最后,呈现 Cell。
if ([tableView isEqual:self.myTableView]) {
static NSString *TableViewCellIdentifier = @"MyCells";
result = [tableView dequeueReusableCellWithIdentifier:TableViewCellIdentifier];
if (result == nil) {
result = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TableViewCellIdentifier];
}
result.textLabel.text = [NSString stringWithFormat:@"Section %ld, Cell %ld", (long)indexPath.section, (long)indexPath.row];
}
return result;
}
图4-2. 一个包含3个Section空白的TableView
当重新加载或刷新TableView,要通过UITableViewDataSource协议查询数据源,请求许多的信息。
TableView首先请求Section的个数,每个Section来负责持有行或cells。数据源确认了Section数目之后,TableView会为每个Section请求行数,数据源获取每个Section的从零开始的索引,并基于这一点,可以决定多少cells已加载到每个Section。
确定了每个Section的cells数目之后,TableView继续请求数据源以展示每个Section的每个cells,可以分配UITableViewCell类的实例并把其返回TableView。当然,每个cells可以设置的属性有很多,属性中包括标题,子标题,cells的颜色以及更多。