您的位置:首页 > 产品设计 > UI/UE

IOS开发之----UITableView重用机制

2014-09-24 15:10 369 查看
dequeueResableCellWithIdentifier方法

//对tableview的数据进行绑定,即填充cell,自动调用n次

-(UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath {

UITableViewCell*cell= [tableViewdequeueReusableCellWithIdentifier:@"FlipsideCellIdentifier"];

if(cell== nil) {

cell =[[[UITableViewCell alloc]initWithFrame:CGRectZero

reuseIdentifier:@"FlipsideCellIdentifier"]autorelease];

}

cell.text= [soundSignaturesobjectAtIndex:indexPath.row];

return cell;
}

理解:

每一个UITableView里都维护着一个cell队列,当UITableView刚加载的时候,cell队列里是没有任何数据的。

dequeueResableCellWithIdentifier从字面上理解就是"出列可重用的cell",

也就是根据一个标识identifier从cell队列里取出一个UITableViewCell,

当然了,如果cell队列里没有此标识的cell,调用此方法的结果就是返回nil。

因此,在UITableView刚加载的时候,cell队列里没有可用的cell,所以必须通过语句

cell =[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier] autorelease];

来创建对应CellIdentifier标识的UITableViewCell实例。

[tableView:cellForRowAtIndexPath:方法主要是根据NSIndex取得一个cell ]
而当UITableView在滚动的时候导致UITableViewCell滚出手机屏幕视图的时候,

程序会将这一个UITalbeViewCell实例放入此UITableView所维护的cell队列中。

当UITableview中有新的UITableViewCell需要展现在手机屏幕视图上时,

就会调用tableView:cellForRowAtIndexPath:方法了。

因此我们可以知道以下几点:

1-重取出来的cell是有可能已经捆绑过数据或者加过子视图的,所以,

如果有必要,要清除数据(比如textlabel的text)和remove掉add过的子视图(使用tag)。

2-这样设计的目的是为了避免频繁的 alloc和delloc cell对象而已,没有多复杂。

3-设计的关键是实现cell和数据的完全分离

如果不想重用UITableViewCell实例,如在一个每一行都显示不同内容的UITableView实例时,我们可以用如下的方法:

NSString *CellIdentifier = [NSStringstringWithFormat:@"Cell%d%d",[indexPath section], [indexPathrow]];

来重新定义标识。

这样每一行都有其对应的identifier,从cell队列里取出来只有两个结果:

1-cell队列里没有此identifier对应的UITableViewCell实例,返回nil

2-cell队列里有此identifier对应的UITableViewCell实例,而且不会有重用到其他不同行的cell的情况
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: