清除数据源,reloadData,Cell仍有旧信息?

时间:2014-07-21 22:23:50

标签: ios objective-c uitableview ios7

擦除数据源和reloadData后,tableviewcells仍会显示旧信息。

我正在创建一个显示数据库中用户搜索结果的tableview。

当我执行搜索时,将填充数据源并将用户添加到:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

对于创建的每个单元格,都会创建一个关联的个人资料照片和按钮,并将其添加到当前单元格中。

我有一个方法,我只是用于测试,它清除数据源并重新加载所有单元格

- (IBAction)cleardaTables:(id)sender {
    [_dataSource removeAllObjects];
    [self.tableView reloadData];
}

如果我使用该按钮清除搜索,并搜索其他内容,或显示一个占位符单元格,其中显示"搜索用户,"我的占位符单元格仍会显示其前一个单元格中的一个按钮。

任何人都知道如何真正清除细胞数据并展示新鲜细胞吗?

代码 - 抱歉凌乱

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *searchResultCell = @"searchResultCell";
    EIConnectionsGlobalSearchResultCell *cell = [tableView dequeueReusableCellWithIdentifier:searchResultCell];

    if (cell == nil) {
        cell = [[EIConnectionsGlobalSearchResultCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:searchResultCell];
    }

    //Create "no results" cell if datasource is empty after search
    if (_emptySearch == 1)
    {
        cell.imageView.image = nil;
        cell.labelName.text = @"No results...";
        cell.labelConnectionStatus.text = @"Try another search.";
        cell.labelConnectionStatus.textColor = [UIColor grayColor];
        [cell setUserInteractionEnabled:NO];

        return cell;
    }
    else if (_emptySearch == 0)
    {
        //Assigning Search Result
        NSMutableDictionary *searchResult = [_dataSource objectAtIndex:indexPath.row];

        //Text Configs
        cell.labelName.text = [searchResult objectForKey:@"Name"];

        //Assign and Convert ConnectionStatus Number to string and color
        int connectionStatusInt = [[searchResult objectForKey:@"ConnectionStatus"] intValue];
        NSMutableArray *connectionStatus = [self connectionStatusToString:connectionStatusInt withIndexPath:indexPath];
        cell.labelConnectionStatus.text = connectionStatus[0];
        cell.labelConnectionStatus.textColor = connectionStatus[1];

        //Setting up profile photo for cell
        if ([[searchResult objectForKey:@"picDownloaded"] isEqualToString:@"no"] || ![searchResult objectForKey:@"picDownloaded"]) {
            if (self.tableView.dragging == NO && self.tableView.decelerating == NO)
            {
                [self startProfilePicDownload:searchResult andIndex:indexPath];
            }
            //Setting Default Image while downloading
            cell.imageView.image = defaultProfileImage;
        }
        else
        {
            //A profile pic exists in cache, so assign it to the view
            cell.imageView.image = [searchResult objectForKey:@"profilePic"];
        }

        //setting up cell actions
        UIButton *cellAction = [UIButton buttonWithType:UIButtonTypeCustom];
        cellAction.frame = CGRectMake(cell.frame.size.width - 52, 18.0f, 25.0f, 25.0f);
        UIImage *buttonImage = [UIImage imageNamed:@"Arrow-Icon"];
        [cellAction setImage:buttonImage forState:UIControlStateNormal];
        cellAction.imageView.contentMode = UIViewContentModeScaleAspectFit;
        [cellAction setTag:indexPath.row];
        [cellAction addTarget:self action:@selector(showCellActionOptions:) forControlEvents:UIControlEventTouchUpInside];
        [cell addSubview:cellAction];

        return cell;
    }

    return cell;
}

1 个答案:

答案 0 :(得分:1)

细胞被重复使用。这是在滚动表视图以及重新加载时发生的。

您遇到的一个大问题是,当UIButton等于0时,每次重复使用时,都会向单元格添加另一个_emptySearch。但同样的单元格也可以在其他条件下重复使用。 / p>

你有几个选择。

  1. 创建两个不同的自定义单元格。一个用于_emptySearch等于0时所需的行,另一个用于等于1时的行。在这种情况下,请在IB中添加按钮,而不是在cellForRowAtIndexPath中添加按钮。
  2. 保留您拥有的代码,但您需要确保只添加一次按钮,并将其删除,以用于不需要它的单元格。
  3. 另请参阅UITableViewCell prepareForReuse方法。您应该实现此方法(并调用super prepareForReuse)以根据需要重置单元格标签和图像。