Search code examples
core-datauitableviewreloaddata

UILabels NOT Updating


I have a UITableView that is being populated by core data. Now, when I click on a cell, it pushes me to another view where I can edit the data that is in that particular index, when I return, the system either crashes or else doesn't load the changes onto the labels, any ideas? code below

-(void)viewWillAppear:(BOOL)animated 
{    
    searchCriteria = [[NSMutableString alloc] initWithString:@"clientName"];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"clientName" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Client" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];    
    fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];

    [self.clientTableView reloadData];
    [super viewWillAppear:animated];    
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    Client * client = [self.fetchedResultsController objectAtIndexPath:indexPath];
    clientNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 250.00, 30.0)];
    clientNameLabel.tag = 1;
    clientNameLabel.backgroundColor = [UIColor clearColor];
    clientNameLabel.textColor = [UIColor whiteColor];
    clientNameLabel.font =  [UIFont boldSystemFontOfSize:13];
    clientNameLabel.text = client.clientName;
    [cell.contentView addSubview:clientNameLabel];

    clientAccountNumberLabel = [[UILabel alloc] initWithFrame:CGRectMake(15.0, 35.0, 250.00, 30.00)];
    clientAccountNumberLabel.tag = 2;
    clientAccountNumberLabel.textColor = [UIColor whiteColor];
    clientAccountNumberLabel.backgroundColor = [UIColor clearColor];
    clientAccountNumberLabel.font =  [UIFont boldSystemFontOfSize:13];
    clientAccountNumberLabel.text = client.clientAccountNumber;
    [cell.contentView addSubview:clientAccountNumberLabel];

    clientTelephoneNumberLabel = [[UILabel alloc] initWithFrame:CGRectMake(300.0, 0.0, 250, 30.00)];
    clientTelephoneNumberLabel.tag = 3;
    clientTelephoneNumberLabel.textColor = [UIColor whiteColor];
    clientTelephoneNumberLabel.backgroundColor = [UIColor clearColor];
    clientTelephoneNumberLabel.font =  [UIFont boldSystemFontOfSize:13];
    [cell.contentView addSubview:clientTelephoneNumberLabel];

    addressLine1Label = [[UILabel alloc] initWithFrame:CGRectMake(315.0, 35.0, 250, 30.00)];
    addressLine1Label.tag = 4;
    addressLine1Label.textColor = [UIColor whiteColor];
    addressLine1Label.backgroundColor = [UIColor clearColor];
    addressLine1Label.font =  [UIFont boldSystemFontOfSize:13];
    addressLine1Label.text = client.addressLine1;
    [cell.contentView addSubview:addressLine1Label];

    addressLine2Label = [[UILabel alloc] initWithFrame:CGRectMake(315.0, 35.0, 250, 30.00)];
    addressLine2Label.tag = 5;
    addressLine2Label.textColor = [UIColor whiteColor];
    addressLine2Label.backgroundColor = [UIColor clearColor];
    addressLine2Label.text = client.addressLine2;
    addressLine2Label.font =  [UIFont boldSystemFontOfSize:13];
    [cell.contentView addSubview:addressLine2Label];

    addressLine3Label = [[UILabel alloc] initWithFrame:CGRectMake(315.0, 35.0, 250, 30.00)];
    addressLine3Label.tag = 6;
    addressLine3Label.textColor = [UIColor whiteColor];
    addressLine3Label.backgroundColor = [UIColor clearColor];
    addressLine3Label.font =  [UIFont boldSystemFontOfSize:13];
    addressLine3Label.text = client.addressLine3;
    [cell.contentView addSubview:addressLine3Label];

    addressLine4Label = [[UILabel alloc] initWithFrame:CGRectMake(315.0, 35.0, 250, 30.00)];
    addressLine4Label.tag = 7;
    addressLine4Label.textColor = [UIColor whiteColor];
    addressLine4Label.backgroundColor = [UIColor clearColor];
    addressLine4Label.font =  [UIFont boldSystemFontOfSize:13];
    addressLine4Label.text = client.addressLine4;
    [cell.contentView addSubview:addressLine4Label];

    return cell;
}

The Crash Logs are as follows:

2012-06-23 17:08:05.541 iSalesForce[11773:15803] no object at index 1 in section at index 0

And some other code you might find useful are:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [fetchedObjects count];
}

- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 70.0;
}

Solution

  • The problem is most likely in the fact your fetchedResultsController has gone stale (are you using ARC? is that fetchedResultsController a "strong" property?

    Or it may simply be that your fetchedResultsController has no objects and you're insisting that you have exactly one object in your "numberOfSectionsInTableView" method, regardless of the true contents of "fetchedResultsController".

    Try this new & improved function:

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"Cell";
    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }
    
        if(cell == nil)
        {
            // this should never happen, but just in case...
            NSLog( @"cell is still - unexpectedly - nil" );
        } else {
            if(self.fetchedResultsController == nil)
            {
                NSLog( @"surprise, fetchedResultsController is nil" );
            } else {
                Client * client = nil;
                @try {
                    client = [self.fetchedResultsController objectAtIndexPath:indexPath];
                }
                @catch (NSException * e) {
                    NSLog( @"exception thrown while trying to fetch something from fetchedResultsController - %@ %@", [e name], [e reason] );
                }
                @finally {
                    clientNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 250.00, 30.0)];
                    clientNameLabel.tag = 1;
                    clientNameLabel.backgroundColor = [UIColor clearColor];
                    clientNameLabel.textColor = [UIColor whiteColor];
                    clientNameLabel.font =  [UIFont boldSystemFontOfSize:13];
                    clientNameLabel.text = client.clientName;
                    [cell.contentView addSubview:clientNameLabel];
    
                    clientAccountNumberLabel = [[UILabel alloc] initWithFrame:CGRectMake(15.0, 35.0, 250.00, 30.00)];
                    clientAccountNumberLabel.tag = 2;
                    clientAccountNumberLabel.textColor = [UIColor whiteColor];
                    clientAccountNumberLabel.backgroundColor = [UIColor clearColor];
                    clientAccountNumberLabel.font =  [UIFont boldSystemFontOfSize:13];
                    clientAccountNumberLabel.text = client.clientAccountNumber;
                    [cell.contentView addSubview:clientAccountNumberLabel];
    
                    clientTelephoneNumberLabel = [[UILabel alloc] initWithFrame:CGRectMake(300.0, 0.0, 250, 30.00)];
                    clientTelephoneNumberLabel.tag = 3;
                    clientTelephoneNumberLabel.textColor = [UIColor whiteColor];
                    clientTelephoneNumberLabel.backgroundColor = [UIColor clearColor];
                    clientTelephoneNumberLabel.font =  [UIFont boldSystemFontOfSize:13];
                    [cell.contentView addSubview:clientTelephoneNumberLabel];
    
                    addressLine1Label = [[UILabel alloc] initWithFrame:CGRectMake(315.0, 35.0, 250, 30.00)];
                    addressLine1Label.tag = 4;
                    addressLine1Label.textColor = [UIColor whiteColor];
                    addressLine1Label.backgroundColor = [UIColor clearColor];
                    addressLine1Label.font =  [UIFont boldSystemFontOfSize:13];
                    addressLine1Label.text = client.addressLine1;
                    [cell.contentView addSubview:addressLine1Label];
    
                    addressLine2Label = [[UILabel alloc] initWithFrame:CGRectMake(315.0, 35.0, 250, 30.00)];
                    addressLine2Label.tag = 5;
                    addressLine2Label.textColor = [UIColor whiteColor];
                    addressLine2Label.backgroundColor = [UIColor clearColor];
                    addressLine2Label.text = client.addressLine2;
                    addressLine2Label.font =  [UIFont boldSystemFontOfSize:13];
                    [cell.contentView addSubview:addressLine2Label];
    
                    addressLine3Label = [[UILabel alloc] initWithFrame:CGRectMake(315.0, 35.0, 250, 30.00)];
                    addressLine3Label.tag = 6;
                    addressLine3Label.textColor = [UIColor whiteColor];
                    addressLine3Label.backgroundColor = [UIColor clearColor];
                    addressLine3Label.font =  [UIFont boldSystemFontOfSize:13];
                    addressLine3Label.text = client.addressLine3;
                    [cell.contentView addSubview:addressLine3Label];
    
                    addressLine4Label = [[UILabel alloc] initWithFrame:CGRectMake(315.0, 35.0, 250, 30.00)];
                    addressLine4Label.tag = 7;
                    addressLine4Label.textColor = [UIColor whiteColor];
                    addressLine4Label.backgroundColor = [UIColor clearColor];
                    addressLine4Label.font =  [UIFont boldSystemFontOfSize:13];
                    addressLine4Label.text = client.addressLine4;
                    [cell.contentView addSubview:addressLine4Label];
    
                }
    
                Client * client = [self.fetchedResultsController objectAtIndexPath:indexPath];
            }
        }
        return cell;
    }
    

    (I didn't actually test this out... but I did put some new error checking and exception handling into it for you)