轉(zhuǎn)載本博客上原創(chuàng)文章者今豆,請注明出處赃承。
UITableView繼承自UIScrollview,是蘋果為我們封裝好的一個(gè)基于scroll的控件。上面主要是一個(gè)個(gè)的UITableViewCell,可以讓UITableViewCell響應(yīng)一些點(diǎn)擊事件麸俘,也可以在UITableViewCell中加入U(xiǎn)ITextField或者UITextView等子視圖澈魄,使得可以在cell上進(jìn)行文字編輯。
UITableView中的cell可以有很多运嗜,一般會通過重用cell來達(dá)到節(jié)省內(nèi)存的目
的:通過為每個(gè)cell指定一個(gè)重用標(biāo)識符(reuseIdentifier),即指定了單元格的種類,當(dāng)cell滾出屏幕時(shí),會將滾出屏幕的單元格放入
重用的queue中壶辜,當(dāng)某個(gè)未在屏幕上的單元格要顯示的時(shí)候,就從這個(gè)queue中取出單元格進(jìn)行重用担租。
但對于多變的自定義cell砸民,有時(shí)這種重用機(jī)制會出錯(cuò)。比如奋救,當(dāng)一個(gè)cell含有一個(gè)
UITextField的子類并被放在重用queue中以待重用岭参,這時(shí)如果一個(gè)未包含任何子視圖的cell要顯示在屏幕上,就會取出并使用這個(gè)重用的
cell顯示在無任何子視圖的cell中尝艘,這時(shí)候就會出錯(cuò)演侯。
解決方法:
方法1 將獲得cell的方法從- (UITableViewCell*)dequeueReusableCellWithIdentifier:(NSString*)identifier 換為-(UITableViewCell*)cellForRowAtIndexPath:(NSIndexPath*)indexPath
重用機(jī)制調(diào)用的就是dequeueReusableCellWithIdentifier
這個(gè)方法,方法的意思就是“出列可重用的cell”背亥,因而只要將它換為cellForRowAtIndexPath(只從要更新的cell的那一行取出
cell)秒际,就可以不使用重用機(jī)制,因而問題就可以得到解決狡汉,雖然可能會浪費(fèi)一些空間娄徊。
示例代碼:
[plain]view plaincopy
-?(UITableViewCell?*)tableView:(UITableView?*)tableView?cellForRowAtIndexPath:(NSIndexPath?*)indexPath
{
static?NSString?*CellIdentifier?=?@"Cell";
//?UITableViewCell?*cell?=?[tableView?dequeueReusableCellWithIdentifier:CellIdentifier];?//改為以下的方法
UITableViewCell?*cell?=?[tableView?cellForRowAtIndexPath:indexPath];?//根據(jù)indexPath準(zhǔn)確地取出一行,而不是從cell重用隊(duì)列中取出
if?(cell?==?nil)?{
cell?=?[[UITableViewCell?alloc]?initWithStyle:UITableViewCellStyleDefault?reuseIdentifier:CellIdentifier];
}
//...其他代碼
}
方法2 通過為每個(gè)cell指定不同的重用標(biāo)識符(reuseIdentifier)來解決盾戴。
重用機(jī)制是根據(jù)相同的標(biāo)識符來重用cell的寄锐,標(biāo)識符不同的cell不能彼此重用。于是我們將每個(gè)cell的標(biāo)識符都設(shè)置為不同,就可以避免不同cell重用的問題了橄仆。
示例代碼:
[plain]view plaincopy
-?(UITableViewCell?*)tableView:(UITableView?*)tableView?cellForRowAtIndexPath:(NSIndexPath?*)indexPath
{
NSString?*CellIdentifier?=?[NSString?stringWithFormat:@"Cell%d%d",?[indexPath?section],?[indexPath?row]];//以indexPath來唯一確定cell
UITableViewCell?*cell?=?[tableView?dequeueReusableCellWithIdentifier:CellIdentifier];?//出列可重用的cell
if?(cell?==?nil)?{
cell?=?[[UITableViewCell?alloc]?initWithStyle:UITableViewCellStyleDefault?reuseIdentifier:CellIdentifier];
}
//...其他代碼
}
方法3 刪除重用cell的所有子視圖
這個(gè)方法是通過刪除重用的cell的所有子視圖剩膘,從而得到一個(gè)沒有特殊格式的cell,供其他cell重用沿癞。
示例代碼:
[plain]view plaincopy
-?(UITableViewCell?*)tableView:(UITableView?*)tableView?cellForRowAtIndexPath:(NSIndexPath?*)indexPath
{
static?NSString?*CellIdentifier?=?@"Cell";
UITableViewCell?*cell?=?[tableView?dequeueReusableCellWithIdentifier:CellIdentifier];?//出列可重用的cell
if?(cell?==?nil)?{
cell?=?[[UITableViewCell?alloc]?initWithStyle:UITableViewCellStyleDefault?reuseIdentifier:CellIdentifier];
}
else
{
//刪除cell的所有子視圖
while?([cell.contentView.subviews?lastObject]?!=?nil)
{
[(UIView*)[cell.contentView.subviews?lastObject]?removeFromSuperview];
}
}
//...其他代碼
}
參考文章:http://blog.csdn.net/orietech/article/details/6653974
http://blog.sina.com.cn/s/blog_5fb39f910101aend.html
http://blog.csdn.net/ugg/article/details/7237902