參考文章連接:https://www.cnblogs.com/wangtianyi/p/5880683.html 作者:王天義
特別說(shuō)明一下腐碱,文章內(nèi)容全部來(lái)自王天義矗愧。
文章只用于自己學(xué)習(xí)記錄不做其他任何用抓艳。如有任何問(wèn)題請(qǐng)與我聯(lián)系。
常規(guī)配置如下 當(dāng)超過(guò)tableView顯示的范圍的時(shí)候 后面顯示的內(nèi)容將會(huì)和前面重復(fù)碧库。
// 這樣配置的話(huà)超過(guò)頁(yè)面顯示的內(nèi)容會(huì)重復(fù)出現(xiàn)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
? ? // 定義唯一標(biāo)識(shí)
? ? static NSString *CellIdentifier = @"Cell";
? ? // 通過(guò)唯一標(biāo)識(shí)創(chuàng)建cell實(shí)例
? ? UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
? ? // 判斷為空進(jìn)行初始化? --(當(dāng)拉動(dòng)頁(yè)面顯示超過(guò)主頁(yè)面內(nèi)容的時(shí)候就會(huì)重用之前的cell堪夭,而不會(huì)再次初始化)
? ? if (!cell) {
? ? ? ? cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
? ? }
? ? // 對(duì)cell 進(jìn)行簡(jiǎn)單地?cái)?shù)據(jù)配置
? ? cell.textLabel.text = @"text";
? ? cell.detailTextLabel.text = @"text";
? ? cell.imageView.image = [UIImage imageNamed:@"4.png"];
? ? return cell;
}
通過(guò)以下3方案可以解決
方案一 ?取消cell的重用機(jī)制,通過(guò)indexPath來(lái)創(chuàng)建cell 將可以解決重復(fù)顯示問(wèn)題 不過(guò)這樣做相對(duì)于大數(shù)據(jù)來(lái)說(shuō)內(nèi)存就比較吃緊了
// 方案一 通過(guò)不讓他重用cell 來(lái)解決重復(fù)顯示
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
? ? // 定義唯一標(biāo)識(shí)
? ? static NSString *CellIdentifier = @"Cell";
? ? // 通過(guò)indexPath創(chuàng)建cell實(shí)例 每一個(gè)cell都是單獨(dú)的
? ? UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
? ? // 判斷為空進(jìn)行初始化? --(當(dāng)拉動(dòng)頁(yè)面顯示超過(guò)主頁(yè)面內(nèi)容的時(shí)候就會(huì)重用之前的cell惹想,而不會(huì)再次初始化)
? ? if (!cell) {
? ? ? ? cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
? ? }
? ? // 對(duì)cell 進(jìn)行簡(jiǎn)單地?cái)?shù)據(jù)配置
? ? cell.textLabel.text = @"text";
? ? cell.detailTextLabel.text = @"text";
? ? cell.imageView.image = [UIImage imageNamed:@"4.png"];
? ? return cell;
}
方案二 ?讓每個(gè)cell都擁有一個(gè)對(duì)應(yīng)的標(biāo)識(shí) 這樣做也會(huì)讓cell無(wú)法重用 所以也就不會(huì)是重復(fù)顯示了 顯示內(nèi)容比較多時(shí)內(nèi)存占用也是比較多的和方案一類(lèi)似
// 方案二 同樣通過(guò)不讓他重用cell 來(lái)解決重復(fù)顯示 不同的是每個(gè)cell對(duì)應(yīng)一個(gè)標(biāo)識(shí)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
? ? // 定義cell標(biāo)識(shí)? 每個(gè)cell對(duì)應(yīng)一個(gè)自己的標(biāo)識(shí)
? ? NSString *CellIdentifier = [NSString stringWithFormat:@"cell%ld%ld",indexPath.section,indexPath.row];
? ? // 通過(guò)不同標(biāo)識(shí)創(chuàng)建cell實(shí)例
? ? UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
? ? // 判斷為空進(jìn)行初始化? --(當(dāng)拉動(dòng)頁(yè)面顯示超過(guò)主頁(yè)面內(nèi)容的時(shí)候就會(huì)重用之前的cell,而不會(huì)再次初始化)
? ? if (!cell) {
? ? ? ? cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
? ? }
? ? // 對(duì)cell 進(jìn)行簡(jiǎn)單地?cái)?shù)據(jù)配置
? ? cell.textLabel.text = @"text";
? ? cell.detailTextLabel.text = @"text";
? ? cell.imageView.image = [UIImage imageNamed:@"4.png"];
? ? return cell;
}
方案三 只要最后一個(gè)顯示的cell內(nèi)容不為空督函,然后把它的子視圖全部刪除嘀粱,等同于把這個(gè)cell單獨(dú)出來(lái)了 然后跟新數(shù)據(jù)就可以解決重復(fù)顯示
// 方案三 當(dāng)頁(yè)面拉動(dòng)需要顯示新數(shù)據(jù)的時(shí)候,把最后一個(gè)cell進(jìn)行刪除 就有可以自定義cell 此方案即可避免重復(fù)顯示辰狡,又重用了cell相對(duì)內(nèi)存管理來(lái)說(shuō)是最好的方案 前兩者相對(duì)比較消耗內(nèi)存
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
? ? // 定義唯一標(biāo)識(shí)
? ? static NSString *CellIdentifier = @"Cell";
? ? // 通過(guò)唯一標(biāo)識(shí)創(chuàng)建cell實(shí)例
? ? UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
? ? // 判斷為空進(jìn)行初始化? --(當(dāng)拉動(dòng)頁(yè)面顯示超過(guò)主頁(yè)面內(nèi)容的時(shí)候就會(huì)重用之前的cell锋叨,而不會(huì)再次初始化)
? ? if (!cell) {
? ? ? ? cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
? ? }
? ? else//當(dāng)頁(yè)面拉動(dòng)的時(shí)候 當(dāng)cell存在并且最后一個(gè)存在 把它進(jìn)行刪除就出來(lái)一個(gè)獨(dú)特的cell我們?cè)谶M(jìn)行數(shù)據(jù)配置即可避免
? ? {
? ? ? ? while ([cell.contentView.subviews lastObject] != nil) {
? ? ? ? ? ? [(UIView *)[cell.contentView.subviews lastObject] removeFromSuperview];
? ? ? ? }
? ? }
? ? // 對(duì)cell 進(jìn)行簡(jiǎn)單地?cái)?shù)據(jù)配置
? ? cell.textLabel.text = @"text";
? ? cell.detailTextLabel.text = @"text";
? ? cell.imageView.image = [UIImage imageNamed:@"4.png"];
? ? return cell;
}