解釋一:
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。
解釋二:
每一個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的情況
解釋三:
每一個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的情況
解釋四:
解決uitableviewcell重繪出現重疊的現象
當我們的uitableview為透明或者判斷cell是否為空時,會發現uitableveiwcell會出現重疊,下面為自己的解決辦法,提供給各位參考
-(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]; ?//刪除并進行重新分配
}
}
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];