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 override initWithCoder:
and/or awakeFromNib
.
You can override these methods as needed, but do not call them yourself. Both initWithCoder:
and awakeFromNib
will 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:
// This bit is unnecessary with storyboards:
if (newCell == nil) {
newCell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: MAINVIEW_CELLIDENTIFIER];
[newCell autorelease];
newCell.selectionStyle = UITableViewCellSelectionStyleNone;
}
Hope that helps.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…