iOS-UITableView重用機制 ,圖片重新整理,
關於講解UITabel View的使用
參照 連結 http://www.bubuko.com/infodetail-974265.html
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *identifier = @"cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; if (!cell) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; } return cell;}
identifier
可以看到在建立cell的時候伴隨著一個identifier的綁定,這個identifier可以理解為這個cell標識,標識它屬於哪個重用隊列。
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
再來看這句代碼,從重用隊列中取出一個cell,注意傳入的參數identifier,如果把重用隊列比作一個房間,那麼identifier就好比這個房間的門牌號,標記著要從指定的房間去找人(也就是cell)。另外,入隊的時候也會根據cell的identifier放到指定的重用隊列中。
可想而知,因為上面那段代碼所有的cell都用了相同的identifier,所以只會在一個重用隊列中進進出出。假如把代碼改成這樣:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ NSString *identifier = [NSString stringWithFormat:@"cell%d",indexPath.row]; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; if (!cell) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; } return cell;}
建立cell的時候對每個cell綁定不同的identifier,那麼每個cell在入隊的時候就會被放到不同的隊列中,這樣第一遍
下拉100個cell都是後每次調用dequeueReusableCellWithIdentifier都無法在對對應重用隊列中找到cell,因此要建立100個cell,這就增大了消耗。
註冊cell
[_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:identifier];
可以在建立tableView的時候用這個方法註冊cell,註冊之後的作用是每次從重用列表中取cell 的時候,假如不存在,系統就會自動幫我們建立cell,並綁定標識符identifier。可想而知,註冊之後就不需要再寫這段代碼了:
if (!cell) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];}
解決列表重複混亂問題
參考文章中,用解決列表重複的3種方法。
我將一下我在開發中實際解決的方案。
我的需求是重用CELL ,但是資料不一樣,每個CELL 的長度也是不一樣的。不過需要的資料類型是一樣的。
重用CELL,
1、清除CELL 的顯示的所有資料,
2、賦值CELL新資料,通過代碼,重新布局cell。並計算出cell 的高度。
3、在UItabeleView的控制頁面,通過字典紀錄cell的高度(keys 是我顯示資料的唯一ID,value是cell的高度)
4、在UItableView的代理方法中,
(- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath,)取出cell的高度進行賦值。
解決列表中重新整理圖片問題
我需求是CELL 中的圖片,之前顯示預設的圖片,當圖片 資料下載成功後,重新整理當前cell的頁面,顯示最新圖片資料,
//自訂放大,圖片現在下載成功,得到通知調用的方法
-(void)reloadSelectButtonInfo
{
NSArray *cells = self.myTabelView.visibleCells; //擷取當前顯示的cell
for (int i = 0; i < [cells count]; i++) {
MyTableViewCell * cell = cells[i];
[cell UserIsReferenceWithShareItem];//cell 中顯示圖片的方法
}
}