亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

UITableView中Cell重用機制導致內容重復的解決方法

2020-07-26 02:46:35
字體:
來源:轉載
供稿:網友

UITableView繼承自UIScrollview,是蘋果為我們封裝好的一個基于scroll的控件。上面主要是一個個的UITableViewCell,可以讓UITableViewCell響應一些點擊事件,也可以在UITableViewCell中加入UITextField或者UITextView等子視圖,使得可以在cell上進行文字編輯。

UITableView中的cell可以有很多,一般會通過重用cell來達到節省內存的目的:通過為每個cell指定一個重用標識符(reuseIdentifier),即指定了單元格的種類,當cell滾出屏幕時,會將滾出屏幕的單元格放入重用的queue中,當某個未在屏幕上的單元格要顯示的時候,就從這個queue中取出單元格進行重用。

但對于多變的自定義cell,有時這種重用機制會出錯。比如,當一個cell含有一個UITextField的子類并被放在重用queue中以待重用,這時如果一個未包含任何子視圖的cell要顯示在屏幕上,就會取出并使用這個重用的cell顯示在無任何子視圖的cell中,這時候就會出錯。

解決方法:

方法1 將獲得cell的方法從- (UITableViewCell*)dequeueReusableCellWithIdentifier:(NSString*)identifier 換為-(UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath

重用機制調用的就是dequeueReusableCellWithIdentifier這個方法,方法的意思就是“出列可重用的cell”,因而只要將它換為cellForRowAtIndexPath(只從要更新的cell的那一行取出cell),就可以不使用重用機制,因而問題就可以得到解決,雖然可能會浪費一些空間。

示例代碼:

[plain]- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{  static NSString *CellIdentifier = @"Cell";  // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];   //改為以下的方法  UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];   //根據indexPath準確地取出一行,而不是從cell重用隊列中取出  if (cell == nil) {    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];  }   //...其他代碼               }- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{  static NSString *CellIdentifier = @"Cell";  // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];   //改為以下的方法  UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];   //根據indexPath準確地取出一行,而不是從cell重用隊列中取出  if (cell == nil) {    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];  }   //...其他代碼               }

方法2 通過為每個cell指定不同的重用標識符(reuseIdentifier)來解決。
重用機制是根據相同的標識符來重用cell的,標識符不同的cell不能彼此重用。于是我們將每個cell的標識符都設置為不同,就可以避免不同cell重用的問題了。

示例代碼:

[plain]- (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];  }  //...其他代碼}- (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的所有子視圖

這個方法是通過刪除重用的cell的所有子視圖,從而得到一個沒有特殊格式的cell,供其他cell重用。

示例代碼:

[plain]- (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];    }  }  //...其他代碼}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品国产精品国自产观看浪潮| 欧美精品成人91久久久久久久| 欧美午夜影院在线视频| 色偷偷亚洲男人天堂| 性视频1819p久久| 国产自摸综合网| 亚洲视频在线观看| 欧美成人h版在线观看| 亚洲福利影片在线| 国产91精品不卡视频| 国产成人精彩在线视频九色| 日产精品久久久一区二区福利| 日韩av成人在线观看| 国产拍精品一二三| 国产精品爱久久久久久久| 亚洲综合在线小说| 国产精品爽爽爽爽爽爽在线观看| 亚洲国产一区自拍| 欧美巨大黑人极品精男| 国产精品www| 欧美日韩亚洲激情| 国产精品免费一区二区三区都可以| 久久97精品久久久久久久不卡| 亚洲欧美国产一区二区三区| 在线成人中文字幕| 亚洲欧美国产视频| 中文字幕自拍vr一区二区三区| 视频在线观看99| 亚洲成人精品久久| 伊人成人开心激情综合网| 亚洲美女在线观看| 亚洲三级av在线| 欧美成人免费网| 欧美一区二区三区免费视| 久久久999成人| 高清欧美性猛交xxxx黑人猛交| 成人www视频在线观看| 欧美一级片在线播放| 日本91av在线播放| 777精品视频| 97热在线精品视频在线观看| 91精品视频一区| 一区二区三区高清国产| 欧美亚洲国产日本| 亚洲激情视频在线观看| 91精品国产色综合久久不卡98口| 日韩在线免费观看视频| 色噜噜狠狠狠综合曰曰曰| 国产激情久久久久| 国产美女久久精品| 精品一区精品二区| 欧美精品生活片| 成人欧美在线观看| 91成人在线观看国产| 亚洲精品国产精品乱码不99按摩| 性色av一区二区三区| 国产精品视频免费在线| 欧美性xxxxxx| 午夜精品久久久久久99热软件| 欧美乱大交做爰xxxⅹ性3| 国内精品久久影院| 亚洲免费视频一区二区| 欧美老女人bb| 久久亚洲国产成人| 久久国产精品久久久| 色悠悠久久88| 久久久久久久久久久免费| 亚洲欧美成人网| 日韩福利伦理影院免费| 日韩精品黄色网| 欧美激情精品久久久久久蜜臀| 日本精品视频在线| 麻豆一区二区在线观看| 欧美亚洲成人xxx| 日韩成人在线免费观看| 国产一级揄自揄精品视频| 精品中文字幕久久久久久| 97成人超碰免| 成人激情视频小说免费下载| 国产免费一区二区三区香蕉精| 亚洲精品动漫100p| 欧美理论电影在线播放| 日韩美女免费观看| 正在播放亚洲1区| 亚洲最大成人网色| 日韩av网址在线观看| 国产精品av在线播放| 国产精品999999| 亚洲精品中文字幕av| 4444欧美成人kkkk| 日韩电影网在线| 日韩成人久久久| 激情av一区二区| 欧美在线日韩在线| 国产成人自拍视频在线观看| 深夜精品寂寞黄网站在线观看| 午夜精品久久久久久久99黑人| 久久国产色av| 国产精品一区二区三区久久| 国产精品视频成人| 亚洲天堂男人天堂| 久久精品久久久久| 国产成人久久精品| 欧美日韩国产精品一区二区三区四区| 精品亚洲夜色av98在线观看| 日韩av在线播放资源| 一区三区二区视频| 最近2019中文字幕第三页视频| 精品国产一区二区三区久久久狼| 国产主播精品在线| 欧美裸体男粗大视频在线观看| 国产精品自产拍在线观看中文| 欧美激情在线观看| 国产精品999| 欧美电影免费观看大全| 亚洲精品av在线| 精品国偷自产在线视频99| 欧美日韩在线看| 国产免费亚洲高清| 欧美日本啪啪无遮挡网站| 亚洲国产欧美精品| 午夜精品美女自拍福到在线| 欧美日韩精品二区| 国产自产女人91一区在线观看| 孩xxxx性bbbb欧美| 91在线无精精品一区二区| 欧美天天综合色影久久精品| 一区二区三区亚洲| 久久精品99久久香蕉国产色戒| 成人黄色中文字幕| 福利一区福利二区微拍刺激| 日韩二区三区在线| 久久久女女女女999久久| 日韩女优人人人人射在线视频| 色综合老司机第九色激情| 亚洲性猛交xxxxwww| 亚州成人av在线| 亚洲精品成a人在线观看| 欧美精品18videos性欧美| 欧美激情视频一区| 91av在线影院| 国产日韩av在线| 欧美成人中文字幕| 国产精品一区二区三区在线播放| 国产精品入口免费视频一| 久久精品中文字幕电影| 国产亚洲精品美女久久久久| 51午夜精品视频| 精品国产91久久久| 欧美在线一级va免费观看| 国产精品主播视频| 91国内揄拍国内精品对白| 亚洲欧美日韩在线高清直播| 国产精品日韩一区| 久热精品视频在线观看| 国产91在线播放九色快色| 日本久久久久久| 欧美另类在线观看| 亚洲精品一区av在线播放| 国产精品三级在线| 国产亚洲精品成人av久久ww| 亚洲视频在线免费看| 国产精品日韩在线| 亚洲电影天堂av|