1. 程式人生 > >iOS之TableViewCell重用機制避免重複顯示問題

iOS之TableViewCell重用機制避免重複顯示問題

一般習慣上我們都會按照下面的方法來寫 、當超過tableView顯示的範圍的時候 、後面顯示的內容將會和前面重複

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if
(!cell) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; } cell.textLabel.text = @"titel"; cell.detailTextLabel.text = @"detail"; cell.imageView.image = [UIImage imageNamed:@"xxx.png"]; return cell; }

解決方案如下:

方案一


取消cell的重用機制、通過indexPath來建立cell、 將可以解決重複顯示問題 、不過這樣做缺點就是相對於大資料來說記憶體壓力就比較大

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    // 通過indexPath建立cell例項 每一個cell都是單獨的
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if
(!cell) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; } cell.textLabel.text = @"titel"; cell.detailTextLabel.text = @"detail"; cell.imageView.image = [UIImage imageNamed:@"xxx.png"]; return cell; }

方案二
讓每個cell都擁有一個對應的標識 、這樣做也會讓cell無法重用 、缺點跟第一個一樣資料太多會造成記憶體壓力就比較大

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *CellIdentifier = [NSString stringWithFormat:@"cell%ld%ld",indexPath.section,indexPath.row];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    // 判斷為空進行初始化  --(當拉動頁面顯示超過主頁面內容的時候就會重用之前的cell,而不會再次初始化)
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }
    cell.textLabel.text = @"titel";
    cell.detailTextLabel.text = @"detail";
    cell.imageView.image = [UIImage imageNamed:@"xxx.png"];
    return cell;
}

方案三
當最後一個顯示的cell內容不為空、然後把它的子檢視全部刪除,相當於把這個cell單獨分離出來、 然後重新整理資料就可以解決重複顯示

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    } else {
    //當頁面拉動的時候 當cell存在並且最後一個存在 把它進行刪除就出來一個獨特的cell我們在進行資料配置即可避免
        while ([cell.contentView.subviews lastObject] != nil) {
       [(UIView *)[cell.contentView.subviews lastObject] removeFromSuperview];
        }
    }
    cell.textLabel.text = @"titel";
    cell.detailTextLabel.text = @"detail";
    cell.imageView.image = [UIImage imageNamed:@"xxx.png"];
    return cell;
}

大概目前就用了這幾種,希望對大家能有點滴幫助,也希望還有最優方案的朋友,歡迎隨時@,一起學習,謝謝!