解釋一:
1.
static NSString *CellTableIdentifier = @"CellTableIdentifier ";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
CellTableIdentifier];
if (!celll) {
cell = [[[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellTableIdentifier] autorelease];
}
首
先诫睬,先說一下重用是如何實現(xiàn)的,我們有一個很長的tableview绿鸣,假設(shè)是100行注簿,但在我們設(shè)計的行高情況下巡雨,屏幕只能顯示10行,所以,當(dāng)加載
view的時候罩抗,實際只創(chuàng)建這10個cell,當(dāng)我們用手指向上滑動即下方的第11個cell向上滑進(jìn)界面的過程中灿椅,我們發(fā)現(xiàn)第一行的cell會滑出界
面套蒂,當(dāng)滑出后,第一行這個cell會被放到重用隊列中茫蛹,第11行將獲得重用隊列中的一個cell操刀,這樣,可以很好的控制內(nèi)存婴洼。
2.
UITableViewCell *cell =
[tableView
dequeueReusableCellWithIdentifier:CellTableIdentifier]; ? 意思是定義一個cell骨坑,在
tableview中的可重用隊列中尋找有CellTableIdentifier標(biāo)識的UITableViewCell,以進(jìn)行重用柬采。這個
Identifier可以由我們自由定義成一些字符串欢唾。當(dāng)然,如果在隊列中有這樣的UITableViewCell粉捻,那么則返回它給cell礁遣,若沒有,則
返回nil給cell肩刃。因為我們在寫程序時經(jīng)常需要用到好幾個表格祟霍,每個表格中的cell布局都不一樣,所以我們需要將在同一個表格的cell(布局一樣)進(jìn)行標(biāo)記Identifier盈包,這樣沸呐,在重用的時候可以得到匹配的cell。
3.
if (!celll) {
cell = [[[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellTableIdentifier] autorelease];
}
if
語句续语,若返回的是nil垂谢,即cell==nil,則我們需要分配空間并初始化一個cell疮茄,而且需要關(guān)聯(lián)reuseIdentifier滥朱,以便后面重用的
時候能夠根據(jù)Identifier找到這個cell根暑,若cell不為nil,則重用成功徙邻,并可return此cell排嫌。
解釋二:
每一個UITableView里都維護(hù)著一個cell隊列,當(dāng)UITableView剛加載的時候缰犁,cell隊列里是沒有任何數(shù)據(jù)的淳地。dequeueResableCellWithIdentifier從字面上理解就是”出列可重用的cell",
也就是根據(jù)一個標(biāo)識identifier從cell隊列里取出一個UITableViewCell,當(dāng)然了帅容,如果cell隊列里沒有此標(biāo)識的cell颇象,調(diào)
用此方法的結(jié)果就是返回nil。因此并徘,在UITableView剛加載的時候遣钳,cell隊列里沒有可用的cell,所以必須通過語句
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
來創(chuàng)建對應(yīng)CellIdentifier標(biāo)識的UITableViewCell實例麦乞。
而當(dāng)UITableView在滾動的時候?qū)е耈ITableViewCell滾出手機屏幕視圖的時候蕴茴,程序會將這一個
UITalbeViewCell實例放入此UITableView所維護(hù)的cell隊列中。當(dāng)UITableview中有新的
UITableViewCell需要展現(xiàn)在手機屏幕視圖上時姐直,就會調(diào)用tableView:cellForRowAtIndexPath:方法了倦淀,因此我
們可以知道以下幾點:
1-重取出來的cell是有可能已經(jīng)捆綁過數(shù)據(jù)或者加過子視圖的,所以声畏,如果有必要撞叽,要清除數(shù)據(jù)(比如textlabel的text)和remove掉add過的子視圖(使用tag)。
2-這樣設(shè)計的目的是為了避免頻繁的 alloc和delloc cell對象而已,沒有多復(fù)雜插龄。
3-設(shè)計的關(guān)鍵是實現(xiàn)cell和數(shù)據(jù)的完全分離
如果不想重用UITableViewCell實例能扒,如在一個每一行都顯示不同內(nèi)容的UITableView實例時,我們可以用如下的方法:
NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];
來重新定義標(biāo)識辫狼。
這樣每一行都有其對應(yīng)的identifier,從cell隊列里取出來只有兩個結(jié)果:
1-cell隊列里沒有此identifier對應(yīng)的UITableViewCell實例,返回nil
2-cell隊列里有此identifier對應(yīng)的UITableViewCell實例辛润,而且不會有重用到其他不同行的cell的情況
解釋三:
每一個UITableView里都維護(hù)著一個cell隊列膨处,當(dāng)UITableView剛加載的時候,cell隊列里是沒有任何數(shù)據(jù)的砂竖。dequeueResableCellWithIdentifier從字面上理解就是”出列可重用的cell",
也就是根據(jù)一個標(biāo)識identifier從cell隊列里取出一個UITableViewCell真椿,當(dāng)然了,如果cell隊列里沒有此標(biāo)識的cell乎澄,調(diào)
用此方法的結(jié)果就是返回nil突硝。因此,在UITableView剛加載的時候置济,cell隊列里沒有可用的cell解恰,所以必須通過語句
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
來創(chuàng)建對應(yīng)CellIdentifier標(biāo)識的UITableViewCell實例锋八。
而當(dāng)UITableView在滾動的時候?qū)е耈ITableViewCell滾出手機屏幕視圖的時候,程序會將這一個
UITalbeViewCell實例放入此UITableView所維護(hù)的cell隊列中护盈。當(dāng)UITableview中有新的
UITableViewCell需要展現(xiàn)在手機屏幕視圖上時挟纱,就會調(diào)用tableView:cellForRowAtIndexPath:方法了,因此我
們可以知道以下幾點:
1-重取出來的cell是有可能已經(jīng)捆綁過數(shù)據(jù)或者加過子視圖的腐宋,所以紊服,如果有必要,要清除數(shù)據(jù)(比如textlabel的text)和remove掉add過的子視圖(使用tag)胸竞。
2-這樣設(shè)計的目的是為了避免頻繁的 alloc和delloc cell對象而已,沒有多復(fù)雜欺嗤。
3-設(shè)計的關(guān)鍵是實現(xiàn)cell和數(shù)據(jù)的完全分離
如果不想重用UITableViewCell實例,如在一個每一行都顯示不同內(nèi)容的UITableView實例時卫枝,我們可以用如下的方法:
NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];
來重新定義標(biāo)識煎饼。
這樣每一行都有其對應(yīng)的identifier,從cell隊列里取出來只有兩個結(jié)果:
1-cell隊列里沒有此identifier對應(yīng)的UITableViewCell實例,返回nil
2-cell隊列里有此identifier對應(yīng)的UITableViewCell實例剃盾,而且不會有重用到其他不同行的cell的情況
解釋四:
解決uitableviewcell重繪出現(xiàn)重疊的現(xiàn)象
當(dāng)我們的uitableview為透明或者判斷cell是否為空時腺占,會發(fā)現(xiàn)uitableveiwcell會出現(xiàn)重疊,下面為自己的解決辦法痒谴,提供給各位參考
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{
UITableViewCell*cell=nil;
staticNSString*reuse=@"cell";
if(cell==nil) {
cell=[[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuse]autorelease];
}else{
while([cell.contentView.subviewslastObject] !=nil) {
[(UIView*)[cell.contentView.subviewslastObject]removeFromSuperview]; ?//刪除并進(jìn)行重新分配
}
}
cell.textLabel.text=@"cell";
returncell;
}
解釋五:
解決UIlable在tablecell上更新重疊的問題
if(cell ==nil) {
cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellName]autorelease];
}
for(UIView* viewincell.contentView.subviews) {
[viewremoveFromSuperview];
}
[cell.contentView addSubview:label];