首页 > 解决方案 > Custom cells in UITableView become blank after scrolling up or down

问题描述

I was tasked to solve this bug in the app (It's for comercial use so I can't link the project). I'm also completely new to Objective-C or IOS development and I have no idea why the following happens. Reminder, I'm using custom cells.

When the tableview loads, everything looks fine. Click here to see the example

But when I scroll up and back to the same postion the cell becomes blank, as if it had no data. Blank cell

If I repeat the same process everything looks fine again.

Here's the code for cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    
    static NSString *cellId = @"cell2";
    PedTableCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
    if (cell == nil)
    {
        cell = [(PedTableCell*)[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
        
    }
    if (tableView==_table3)
    {
        
        NSString *docsDirr;
        NSString *documentsDirectoryForSaveImages;
        docsDirr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
        documentsDirectoryForSaveImages = [docsDirr stringByAppendingPathComponent:@"/CarpetaImatges"];
        
        
        
        NSString *match = @".jpg";
        NSString *preCodigo;
        NSScanner *scanner = [NSScanner scannerWithString:[pedarray objectAtIndex:indexPath.row]];
        [scanner scanUpToString:match intoString:&preCodigo];

        NSString *nomimg=[NSString stringWithFormat:@"%@.jpg", preCodigo];
        
        UIImage *img = [UIImage imageWithContentsOfFile:[documentsDirectoryForSaveImages stringByAppendingPathComponent:nomimg]];
        
        cell.img.image = img;
        cell.layer.borderWidth=1.0f;
        cell.img.layer.borderWidth=1.0f;
        
        
        
        
        cell.cart.text = preCodigo;
        cell.descart.text = [nomarray objectAtIndex:indexPath.row];
        cell.cant.text = [cantarray objectAtIndex:indexPath.row];
        cell.precart.text = [precioarray objectAtIndex:indexPath.row];
        cell.pvpcart.text = [pvparray objectAtIndex:indexPath.row];
        
        [cell layoutIfNeeded];
        
    }
    return cell;
    
}

I've debugged the method and everytime it returns a valid cell. When I click the empty cell it still works as expected. Essentially, the data is there, it's just not rendered for some reason.

I've checked other posts with the same/similar issue but nothing seems to really match. PrepareForReuse is a no go since there's no UI to be changed, just content. I'm getting the values of the arrays with indexPath.row to make sure I'm fetching the correct value. I've even tried to set the heightForRowAtIndexPath to the same height the cell should have (all cells are of the same size and never change) or let AutoLayout handle it but to no avail.

Code of numberOfRowsInSection (Returns the amount of orders that exists in database currently):

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    if(tableView == _table3)
    {
        [self cargacarro];
        
        return pedarray.count;
        
    }
    return pedarray.count;
}

Any ideas?

标签: iosobjective-cuitableview

解决方案


Register your cell nib in storyboard or in code before tableview is loaded, and after replace dequeueReusableCell... with this one

PedTableCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId forIndexPath:indexPath];

cell.img... 
cell.cart...

remove this part, is no longer needed

if (cell == nil)
{
    cell = [(PedTableCell*)[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
}

推荐阅读