在iOS开发中, 我们基本都会用到tableview ,而用到tableview 不可避免 的 就需要 实现 cell 的 重用 , 节省内存开销,提高界面的流畅度 。tableview 的重用 , 我主要用到的 有 Identifier ,tag , 以及 不同的 cell添加 不同的Identifier 。
1. 给cell添加义唯一标识: 这可以说是最常用的 重用 方法 , 由于屏幕显示的cell数量是有限的,所以 tableview会有一个 cell池 放着 创建好的cell , 当一个cell 被移除出屏幕外时,他不会被清除而是 从底部又出现了,但是此时的cell已经加载过数据或者添加处理过的,所以会出现一个 cell重用的问题,这需要我们在 - (UITableViewCell *)tableView:(UITableView *)tableView2cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法中 进行处理.。添加标识的方法是tableview 的cell重用中最常用的,比较常用于 在一个 tableview 界面中 , cell 的 高度不变和 内容视图变化较少的 情况下 , 比如如下图这样的 界面:
2. 我们知道, 一个App 中 的界面千变万化,一个 列表中 ,cell 的内容不可能都是 一样的, 甚至还有 高度内容都不尽相同的 ,比如下图这样的 界面:
像这样的界面,cell的高度和内容视图都不相同,并且cell数量不多但是tableview还是 超过了屏幕 ,这种情况 如果我们用 Identifier的话,那么将会很难处理,而 如果我们 每次都重新创建的话,一个大的cell 消耗也不小并且 需要重新 填充数据 ,对于这样的界面,我一般都是 通过 设置 tag 值来进行 重用的 , 比如在 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法 中
if(![tableView.viewviewWithTag:(indexPath.row + 100)]){
cell = [[UITableViewCell alloc] initWithStyle:style reuseIdentifier:@"cell"];
cell.tag = row + 100; //将cell的tag值设置为row + xx ,因为 设置为0 的话, tableview中本来就有tag 为 0 的 视图
//cell 的处理
return cell;
}else{
return ![tableView.viewviewWithTag:(indexPath.row + 100)];
}
这样的话,tableview的cell有多少就会创建多少的cell,但是就不会每次刷新后创建新的cell ,而且可以保证每个row都能对应都 正确的cell, 不必对 cell的数据进行 处理.
3.对于上面图二, 以及下图, 除了通过设置tag值之外,还有一种重用cell 的方法, 创建不同的cell ,然后不同的cell各自对应不同的标识.
比如上图,我们可以创建两种不同的cell , 一种cell 的右边是 UILabel , 而一种的右边则是 UITextField ,在在 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法 中 , 我们可以给这人两种不同的cell加上 不同的 标识符, 根据 不同的row 判断当前的row 需要显示的是 哪一种cell , 之后通过唯一标识符来获取是否有 可以重用的cell 再进行设置,这样就可以分开处理不同视图的cell ,获取后再分别设置数据就可以了。
后续补上代码第三种的参考代码
(第一次写这个,体谅~)