I’ve created a prototype cell with identifier “mainViewTableCell” in storyboard file and connected the main table view with a custom controller class named “NTTableViewController”.
I’ve implemented function “tableView cellForRowAtIndexPath” in NTTableViewController.m as follows:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString* MAINVIEW_CELLIDENTIFIER = @"mainViewTableCell";
UITableViewCell *newCell = [tableView dequeueReusableCellWithIdentifier: MAINVIEW_CELLIDENTIFIER];
if (newCell == nil) {
newCell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: MAINVIEW_CELLIDENTIFIER];
[newCell autorelease];
newCell.selectionStyle = UITableViewCellSelectionStyleNone;
}
NTContactItem* currentItem = [self.contactItemContainer objectInContainerAtIndex: indexPath.row];
NSString* firstName = currentItem.firstName;
NSString* lastName = currentItem.lastName;
NSString* fullName = [firstName stringByAppendingFormat: lastName];
[newCell.textLabel setText: fullName];
[newCell.detailTextLabel setText: currentItem.mobilePhone];
return newCell;
}
But i keeping getting nil from dequeueReusableCellWithIdentifier and have to create a new instance of cell every time.
Then, what is wrong?
The code : project
Thank you all in advance.
With storyboards and tableviews that have prototype cells,
[tableView dequeueReusableCellWithIdentifier:]should not return nil. Even if this is the very first cell, and there are no cells already in the reuse queue, the tableview will create a new instance of your prototype cell and return that.In your case, the problem was something totally different (I downloaded your project because I was really curious).
In your application’s delegate in your
application:didFinishLaunchingWithOptions:method, you are re-initializing this tableviewcontroller. When you call[masterController init], this calls[super init], which in turn calls[UITableViewController initWithStyle:].That causes the controller to create a new UITableView, which is different from the one in your storyboard. That new UITableView has no prototype cells, and so that’s why
dequeueReusableCellWithIdentifier:is returning nil.The lesson of course is to not re-initialize an Objective-C object that has already been initialized. When your table view controller is loaded from the storyboard, the loading mechanism will initialize it with
initWithCoder:. So if you need to do some custom initialization work (like setting up that NSMutableArray in your case), then just overrideinitWithCoder:and/orawakeFromNib.You can override these methods as needed, but do not call them yourself. Both
initWithCoder:andawakeFromNibwill be called by the Storyboard/nib loading mechanism.If everything is correct, you do not need to create cells programmatically here. This bit of code should not be needed:
Hope that helps.