ios开发 UITableCell 可重用问题
2013-02-28 23:00
295 查看
[b] 解释一:[/b]
1.
static NSString *CellTableIdentifier = @"CellTableIdentifier ";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
CellTableIdentifier];
if (!celll) {
cell = [[[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellTableIdentifier] autorelease];
}
首先,先说一下重用是如何实现的,我们有一个很长的tableview,假设是100行,但在我们设计的行高情况下,屏幕只能显示10行,所以,当加载view的时候,实际只创建这10个cell,当我们用手指向上滑动即下方的第11个cell向上滑进界面的过程中,我们发现第一行的cell会滑出界面,当滑出后,第一行这个cell会被放到重用队列中,第11行将获得重用队列中的一个cell,这样,可以很好的控制内存。
2.
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellTableIdentifier]; 意思是定义一个cell,在tableview中的可重用队列中寻找有CellTableIdentifier标识的UITableViewCell,以进行重用。这个Identifier可以由我们自由定义成一些字符串。当然,如果在队列中有这样的UITableViewCell,那么则返回它给cell,若没有,则返回nil给cell。因为我们在写程序时经常需要用到好几个表格,每个表格中的cell布局都不一样,所以我们需要将在同一个表格的cell(布局一样)进行标记Identifier,这样,在重用的时候可以得到匹配的cell。
3.
if (!celll) {
cell = [[[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellTableIdentifier] autorelease];
}
if语句,若返回的是nil,即cell==nil,则我们需要分配空间并初始化一个cell,而且需要关联reuseIdentifier,以便后面重用的时候能够根据Identifier找到这个cell,若cell不为nil,则重用成功,并可return此cell。
[b] 解释二:[/b]
每一个UITableView里都维护着一个cell队列,当UITableView刚加载的时候,cell队列里是没有任何数据的。dequeueResableCellWithIdentifier从字面上理解就是”出列可重用的cell",也就是根据一个标识identifier从cell队列里取出一个UITableViewCell,当然了,如果cell队列里没有此标识的cell,调用此方法的结果就是返回nil。因此,在UITableView刚加载的时候,cell队列里没有可用的cell,所以必须通过语句
来创建对应CellIdentifier标识的UITableViewCell实例。
而当UITableView在滚动的时候导致UITableViewCell滚出手机屏幕视图的时候,程序会将这一个UITalbeViewCell实例放入此UITableView所维护的cell队列中。当UITableview中有新的UITableViewCell需要展现在手机屏幕视图上时,就会调用tableView:cellForRowAtIndexPath:方法了,因此我们可以知道以下几点:
1-重取出来的cell是有可能已经捆绑过数据或者加过子视图的,所以,如果有必要,要清除数据(比如textlabel的text)和remove掉add过的子视图(使用tag)。
2-这样设计的目的是为了避免频繁的 alloc和delloc cell对象而已,没有多复杂。
3-设计的关键是实现cell和数据的完全分离
如果不想重用UITableViewCell实例,如在一个每一行都显示不同内容的UITableView实例时,我们可以用如下的方法:
来重新定义标识。
这样每一行都有其对应的identifier,从cell队列里取出来只有两个结果:
1-cell队列里没有此identifier对应的UITableViewCell实例,返回nil
2-cell队列里有此identifier对应的UITableViewCell实例,而且不会有重用到其他不同行的cell的情况
[b]解释三:[/b]
每一个UITableView里都维护着一个cell队列,当UITableView刚加载的时候,cell队列里是没有任何数据的。dequeueResableCellWithIdentifier从字面上理解就是”出列可重用的cell",也就是根据一个标识identifier从cell队列里取出一个UITableViewCell,当然了,如果cell队列里没有此标识的cell,调用此方法的结果就是返回nil。因此,在UITableView刚加载的时候,cell队列里没有可用的cell,所以必须通过语句
来创建对应CellIdentifier标识的UITableViewCell实例。
而当UITableView在滚动的时候导致UITableViewCell滚出手机屏幕视图的时候,程序会将这一个UITalbeViewCell实例放入此UITableView所维护的cell队列中。当UITableview中有新的UITableViewCell需要展现在手机屏幕视图上时,就会调用tableView:cellForRowAtIndexPath:方法了,因此我们可以知道以下几点:
1-重取出来的cell是有可能已经捆绑过数据或者加过子视图的,所以,如果有必要,要清除数据(比如textlabel的text)和remove掉add过的子视图(使用tag)。
2-这样设计的目的是为了避免频繁的 alloc和delloc cell对象而已,没有多复杂。
3-设计的关键是实现cell和数据的完全分离
如果不想重用UITableViewCell实例,如在一个每一行都显示不同内容的UITableView实例时,我们可以用如下的方法:
来重新定义标识。
这样每一行都有其对应的identifier,从cell队列里取出来只有两个结果:
1-cell队列里没有此identifier对应的UITableViewCell实例,返回nil
2-cell队列里有此identifier对应的UITableViewCell实例,而且不会有重用到其他不同行的cell的情况
[b]解释四:[/b]
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{
UITableViewCell *cell=nil;
static NSString *reuse=@"cell";
if (cell==nil) {
cell=[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuse] autorelease];
}else{
while ([cell.contentView.subviews lastObject] != nil) {
[(UIView*)[cell.contentView.subviews lastObject] removeFromSuperview]; //删除并进行重新分配
}
}
cell.textLabel.text=@"cell";
return cell;
}
[b]解释五:[/b]
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellName] autorelease];
}
for (UIView * view in cell.contentView.subviews) {
[view removeFromSuperview];
}
[cell.contentView addSubview:label];
1.
static NSString *CellTableIdentifier = @"CellTableIdentifier ";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
CellTableIdentifier];
if (!celll) {
cell = [[[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellTableIdentifier] autorelease];
}
首先,先说一下重用是如何实现的,我们有一个很长的tableview,假设是100行,但在我们设计的行高情况下,屏幕只能显示10行,所以,当加载view的时候,实际只创建这10个cell,当我们用手指向上滑动即下方的第11个cell向上滑进界面的过程中,我们发现第一行的cell会滑出界面,当滑出后,第一行这个cell会被放到重用队列中,第11行将获得重用队列中的一个cell,这样,可以很好的控制内存。
2.
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellTableIdentifier]; 意思是定义一个cell,在tableview中的可重用队列中寻找有CellTableIdentifier标识的UITableViewCell,以进行重用。这个Identifier可以由我们自由定义成一些字符串。当然,如果在队列中有这样的UITableViewCell,那么则返回它给cell,若没有,则返回nil给cell。因为我们在写程序时经常需要用到好几个表格,每个表格中的cell布局都不一样,所以我们需要将在同一个表格的cell(布局一样)进行标记Identifier,这样,在重用的时候可以得到匹配的cell。
3.
if (!celll) {
cell = [[[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellTableIdentifier] autorelease];
}
if语句,若返回的是nil,即cell==nil,则我们需要分配空间并初始化一个cell,而且需要关联reuseIdentifier,以便后面重用的时候能够根据Identifier找到这个cell,若cell不为nil,则重用成功,并可return此cell。
[b] 解释二:[/b]
每一个UITableView里都维护着一个cell队列,当UITableView刚加载的时候,cell队列里是没有任何数据的。dequeueResableCellWithIdentifier从字面上理解就是”出列可重用的cell",也就是根据一个标识identifier从cell队列里取出一个UITableViewCell,当然了,如果cell队列里没有此标识的cell,调用此方法的结果就是返回nil。因此,在UITableView刚加载的时候,cell队列里没有可用的cell,所以必须通过语句
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
来创建对应CellIdentifier标识的UITableViewCell实例。
而当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 = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];
来重新定义标识。
这样每一行都有其对应的identifier,从cell队列里取出来只有两个结果:
1-cell队列里没有此identifier对应的UITableViewCell实例,返回nil
2-cell队列里有此identifier对应的UITableViewCell实例,而且不会有重用到其他不同行的cell的情况
[b]解释三:[/b]
每一个UITableView里都维护着一个cell队列,当UITableView刚加载的时候,cell队列里是没有任何数据的。dequeueResableCellWithIdentifier从字面上理解就是”出列可重用的cell",也就是根据一个标识identifier从cell队列里取出一个UITableViewCell,当然了,如果cell队列里没有此标识的cell,调用此方法的结果就是返回nil。因此,在UITableView刚加载的时候,cell队列里没有可用的cell,所以必须通过语句
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
来创建对应CellIdentifier标识的UITableViewCell实例。
而当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 = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];
来重新定义标识。
这样每一行都有其对应的identifier,从cell队列里取出来只有两个结果:
1-cell队列里没有此identifier对应的UITableViewCell实例,返回nil
2-cell队列里有此identifier对应的UITableViewCell实例,而且不会有重用到其他不同行的cell的情况
[b]解释四:[/b]
解决uitableviewcell重绘出现重叠的现象
当我们的uitableview为透明或者判断cell是否为空时,会发现uitableveiwcell会出现重叠,下面为自己的解决办法,提供给各位参考-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{
UITableViewCell *cell=nil;
static NSString *reuse=@"cell";
if (cell==nil) {
cell=[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuse] autorelease];
}else{
while ([cell.contentView.subviews lastObject] != nil) {
[(UIView*)[cell.contentView.subviews lastObject] removeFromSuperview]; //删除并进行重新分配
}
}
cell.textLabel.text=@"cell";
return cell;
}
[b]解释五:[/b]
解决UIlable在tablecell上更新重叠的问题
if (cell == nil) {cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellName] autorelease];
}
for (UIView * view in cell.contentView.subviews) {
[view removeFromSuperview];
}
[cell.contentView addSubview:label];
相关文章推荐
- ios开发 UITableCell 可重用问题
- iOS开发-简述UITableView中cell的重用问题
- iOS开发笔记--解决UITableView中Cell重用机制导致内容出错的方法总结
- iOS开发笔记--解决UITableView中Cell重用机制导致内容出错的方法总结
- iOS开发:开发过程中遇到的cell重用问题(其一)
- IOS开发 UITableView中Cell重用机制导致内容重复解决方法
- iOS开发笔记--解决UITableView中Cell重用机制导致内容出错的方法总结
- ios开发基础1---UITableView中cell重用导致内容出错
- iOS 解决cell因重用机制出错的问题
- iOS开发之关于cell的重用机制
- iOS开发-关于UITableView去掉粘性的问题
- iOS UITableViewCell重用机制避免重复显示问题
- ios之清除cell缓存,解决cell的重用问题。
- iOS开发之高级视图—— UITableView(四)自定义Cell
- iOS开发-UITableView-5(cell对勾)
- iOS 开发 UItableView中滑动删除 cell
- 关于iOS UITableView 数据源数组加载完成之后,滑动时出现cell为空的问题解决笔记
- ios tableView UITableView中Cell重用机制导致内容重复解决方法
- ios tableView那些事 (十六) UITableView中Cell重用机制导致内容重复解决方法
- ios UITableView中Cell的重用机制