解釋一:
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;
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;
}
解釋五:
解決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];