首先,
一個可變數(shù)組用于保存當(dāng)前顯示的cell,
一個可變字典用于保存可以重用的cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
重用的這句代碼,實際上就是通過標(biāo)識符identifier(實際上就是可變字典的key)從重用隊列里面取出一個標(biāo)識為identifier的cell.如果沒有這個標(biāo)識符的cell,則不做操作.
現(xiàn)在我們再來看看,整個重用的過程
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: @"cell"];
}
return cell;
}
一開始的時候,重用隊列為空,所以會進(jìn)入到if里,初始化一個cell,并且加上標(biāo)識符@"cell",
假設(shè)一共屏幕一共可以顯示10個cell. tableview初始化之后會在顯示數(shù)組生成10個標(biāo)識符為@"cell"的cell.
當(dāng)拉動tableview的時候,第一個cell消失,而第11個cell出現(xiàn),此時,重用隊列依舊是nil,初始化第11個cell,消失的第一個cell被放入重用隊列.
當(dāng)?shù)?2個cell創(chuàng)建時,重用隊列已經(jīng)有了標(biāo)識符為@"cell"的cell了,取出這個cell,無需初始化,生成第12個cell.同時,第2個cell放入重用隊列.
這樣下來,創(chuàng)建任意數(shù)量的cell實際上都只是是創(chuàng)建了"顯示數(shù)量+1"的cell.
當(dāng)然這樣也會出現(xiàn)一個問題,
在方法里直接addsubview的時候,重用的cell不會主動去remove這些子視圖,會出現(xiàn)多次addsubview影響運行的問題...這邊有多種解決辦法....
1.不同的cell使用不同的標(biāo)識符.
(網(wǎng)上找的,其實這樣挺蠢的,這樣做其實重用的意義已經(jīng)失去了.)
雖然解決了多次重復(fù)添加子視圖的問題,,但是會去初始化大量的cell.不推薦.
2.自定義UITableViewCell
在自定義的cell初始化方法中去addsubview,在tableView:cellForRowAtIndexPath:方法中只修改子視圖的屬性不添加子視圖.
3.在tableView:cellForRowAtIndexPath:中移除cell的所有子視圖后在使用addsubview方法.
具體如下:
[cell.subviews enumerateObjectsUsingBlock:^(UIView *obj, NSUInteger idx, BOOL *stop) {
UIView *subView = (UIView *)obj;
[subView removeFromSuperview];
}];