关于UITableView的Cell zhuanzai
關于UITableView的Cell復用談談我的一些心得??
2012-06-13 12:16:15|??分類:?Apple|字號?訂閱
UITableView是ios開發中使用率極高的一個控件,就我個人來說,幾乎我做的每一個View上都有她的身影。但是很長一段時間,我對她的理解都很膚淺。對我來說觸動較大的兩個東西,一個是前面提到的自定義UITableViewCell,再有就是今天要提的這個復用了。
所謂復用表面意思來理解就是重復利用了。大致的工作原理就是:UITableView屬于lazy loading,也就是只加載會在界面上顯示的部分。舉個例子,比如說UITabeview的調試是460,咱們每個Cell的調試是230,這樣的話,手機界面上最多就顯示兩個Cell,當你向上劃動,第一個Cell一些離開界面,第三個Cell的一些出現在界面的時候會再創建第三個Cell。注意關鍵部分到了,再第二個Cell開始離開界面,第四個Cell出現的時候,這時候不會創建第四個Cell,而是直接復用的第一個Cell!也就是說無論你的UITableView里有十條或者三十條數據,只會創建三個Cell來展示這些數據!
總的來說,這種工作機制很合理,無論從CPU和內存的角度考慮都很節省資源,但是這里有一個問題就是:這種機制是用來展示結構一樣的數據的!很多時候我們總要實現動態加載,總要有一個Cell,與其它的Cell不同,用來顯示“正在加載中”或者“加載更多”之類的東西。這時候在Cell復用的機制下會出現重疊的現像!
ok,光說不練,沒啥用,簡單演示一下:
? for (int i = 0; i < 10; i++) {
? ? [_objects addObject:[NSString stringWithFormat:@"text %d",i]];
? }
? [_objects addObject:@"加載更多"];
? for (int i = 0; i < 10; i++) {
? ? [_objects addObject:[NSString stringWithFormat:@"text %d",i]];
? }
我們在一個數組里加了21條數據,而且中間那條不一樣,屬于我們說的數據結構不一致的那種。
cell展示部分我們是這么寫的:
??
? //我們希望“加載更多”這行是居中顯示
? if (![_text hasPrefix:@"text"]) {
? ? cell.textLabel.textAlignment = UITextAlignmentCenter;
? }
? cell.textLabel.text = _text;
ok,我們運行一下:
向下拖動一下,目前看來是沒有問題的??墒钱斘覀兩舷峦蟿恿藥状我院?#xff0c;問題出現了。。
由于cell的復用機制,“文本居中”(UITextAlignmentCenter)這種屬性漸漸的被其它Cell用上了。這個腫么辦呢?最早的時候,我通過了網上搜索,大家都說這是Cell的復用的問題。而我想當然的認為,既然是復用,那我就不復用就好了。于是我把
? ? cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
? ? cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
? }
改成了:
if (cell != nil) {? ? [cell release];
? }
? cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
? cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
是的,在我這么改完以后,UITableView看起來確實是按我想的方式工作了,事實上很長的時間里都沒再出過錯。(不要問我為什么不在if后面跟個else把文本的屬性設成“文本居左”(UITextAlignmentLeft),因為實際的數據比這復雜的多。)這種方法一直工作的很ok(確切的說是在iphone4上),直到很久以后,我把同樣的程序在itouch上一跑,沒載入多少條數據就提示Received memory warning了。。。。。
所以我知道了正確的Cell復用的方式:
??
? UITableViewCell *cell;
? if ([_text hasPrefix:@"text"]) {
? ? static NSString *CellIdentifier = @"Cell";
? ??
? ? cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
? ? if (cell == nil) {
? ? ? cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?reuseIdentifier:CellIdentifier] autorelease];
? ? ? cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
? ? }
? }
? else {
? ? static NSString *CellIdentifier = @"CellReuse";
? ??
? ? cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
? ? if (cell == nil) {
? ? ? cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?reuseIdentifier:CellIdentifier] autorelease];
? ? ? cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
? ? }
? ??
? ? cell.textLabel.textAlignment = UITextAlignmentCenter;
? }
??
? cell.textLabel.text = _text;
再運行試一下,是不是怎么上下拖動也不報錯了:)
完整工程下載:
UITableViewCellReuse
當然了除了以上提到的兩點,UITableView還有很多比你想的要優秀的地方沒有提到,以后有機會有一一表述。
?
原帖:http://blog.cnrainbird.com/index.php/2012/03/20/guan_yu_uitableview_de_cell_fu_yong_tan_tan_wo_de_yi_xie_xin_de/
轉載于:https://www.cnblogs.com/loveiosfzs/archive/2013/01/23/2873665.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的关于UITableView的Cell zhuanzai的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS Xcode4.2代码管理工具的使
- 下一篇: SQLite的局限性