Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Assertion failure in UITableView configureCellForDisplay:forIndexPath:

I'm not sure where the error is here, having looked at other similar issues. I received an Assertion failure.

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath: 

I think it is something simple but hope someone can help.

Below is my code:

#import "StockMarketViewController.h"  @interface StockMarketViewController ()  @end   @implementation StockMarketViewController @synthesize ShareNameText, ShareValueText, AmountText; @synthesize shares, shareValues;   - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; {     return [shares count];  }  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; {     UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];        NSString *currentValue = [shareValues objectAtIndex:[indexPath row]];     [[cell textLabel]setText:currentValue];     return cell;  } 
like image 706
Jason Taylor Avatar asked Mar 09 '13 13:03

Jason Taylor


2 Answers

you are never creating a cell, you just try to reuse a dequeued cell. but as you never created one, there is none.

- (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];     }      NSString *currentValue = [shareValues objectAtIndex:[indexPath row]];     [[cell textLabel]setText:currentValue];     return cell; } 

or try (only iOS 6+)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; {     static NSString *cellIdentifier = @"cell";     UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];      NSString *currentValue = [shareValues objectAtIndex:[indexPath row]];     [[cell textLabel]setText:currentValue];     return cell; } 

from UITableView.h

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier;  // Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one. - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier                             forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0); // newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered 

-dequeueReusableCellWithIdentifier: will always need a check, if a cell was returned, while
-dequeueReusableCellWithIdentifier:forIndexPath: can instantiate new one.

like image 89
vikingosegundo Avatar answered Oct 06 '22 01:10

vikingosegundo


If you have not defined a prototype cell with the identifier @"cell" in Storyboard, you will get an assertion error when you attempt to dequeue it.

You can fix this by setting the Identifier property on the prototype cell (select the cell and set that attribute in the right hand panel).

like image 26
sapi Avatar answered Oct 06 '22 01:10

sapi