Assertion Failure in UITableViewController

gsapienza picture gsapienza · Aug 3, 2012 · Viewed 30.8k times · Source

I am taking the iTunes U Stanford iOS Class and am working on one of the assignments to build a little Flickr app. I am getting an error that I cannot seem to be able to debug which comes up as

* Assertion failure in -[UITableView _configureCellForDisplay:forIndexPath:], /SourceCache/UIKit_Sim/UIKit-2280.1/UITableView.m:5336 2012-08-03 10:59:24.596 Assignment 4[4611:c07] (null) libc++abi.dylib: terminate called throwing an exception

My code for the tableviewcontroller in question:

#import "PlacesPhotosTableViewController.h"

@interface PlacesPhotosTableViewController ()
@property (nonatomic) NSDictionary *placeToDisplay;
@property (nonatomic) NSArray *photosInPlace;
@end

@implementation PlacesPhotosTableViewController
@synthesize placeToDisplay = _placeToDisplay;
@synthesize photosInPlace = _photosInPlace;

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (id)init
{
    self = [super init];

    return self;
}

- (id)initWithPlace:(NSDictionary *)place
{
    self = [self init];
    if (self)
    {
        self.placeToDisplay = place;
    }

    return self;
}

- (NSArray *)photosInPlace
{
    if (_photosInPlace == nil)
    {
        _photosInPlace = [FlickrFetcher photosInPlace:self.placeToDisplay maxResults:50];
    }

    return _photosInPlace;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog([self.placeToDisplay valueForKeyPath:@"description._content"]);

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - Table view data source


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
#warning Incomplete method implementation.
    // Return the number of rows in the section.
    return [self.photosInPlace count];
}

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

    NSString *string = [[self.photosInPlace objectAtIndex:indexPath.row] valueForKeyPath:@"description._content"];

    cell.textLabel.text = string;

    return cell;
}

Answer

jerrylroberts picture jerrylroberts · Aug 3, 2012

CellIdentifier I bet your cellForRowAtIndexPath is returning nil.

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

    /** NOTE: This method can return nil so you need to account for that in code */
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // NOTE: Add some code like this to create a new cell if there are none to reuse
    if(cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

    }

    NSString *string = [[self.photosInPlace objectAtIndex:indexPath.row]     valueForKeyPath:@"description._content"];

    cell.textLabel.text = string;

    return cell;
}

That's probably why [UITableView _configureCellForDisplay:forIndexPath:] is failing... because cellForRowAtIndexPath is returning a null value and then configureCellForDisplay is expecting a UITableViewCell.