继续从dequeueReusableCellWithIdentifier得到零?

我在故事板文件中创build了一个标识为“mainViewTableCell”的原型单元格,并将主表视图与名为“NTTableViewController”的自定义控制器类相连接。 我在NTTableViewController.m中实现了“tableView cellForRowAtIndexPath”函数,如下所示:

- (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; } 

但是我从dequeueReusableCellWithIdentifier得到了零,并且每次都必须创build一个新的单元实例。

那么,什么是错的?

代码: 项目

谢谢大家。

对于具有原型单元格的storyboard和tableviews, [tableView dequeueReusableCellWithIdentifier:]不应返回nil。 即使这是第一个单元格,并且重用队列中没有单元格,tableview将创build一个新的原型单元格实例并返回该实例。

在你的情况下,这个问题是完全不同的(我下载你的项目,因为我真的很好奇)。

在应用程序的委托中application:didFinishLaunchingWithOptions:方法,您正在重新初始化此tableviewcontroller。 当您调用[masterController init] ,会调用[super init] ,然后调用[UITableViewController initWithStyle:]

这会导致控制器创build一个新的UITableView,与故事板中的UITableView不同。 新的UITableView没有原型单元,所以这就是为什么dequeueReusableCellWithIdentifier:返回nil。

当然,这个教训是不要重新初始化一个已经被初始化的Objective-C对象。 当你的表视图控制器从故事板加载时,加载机制将用initWithCoder:来初始化它。 所以如果你需要做一些自定义的初始化工作(比如在你的情况下设置NSMutableArray),那么就重写initWithCoder:和/或awakeFromNib

您可以根据需要重写这些方法,但不要自己调用它们。 initWithCoder:awakeFromNib都将被Storyboard / nib加载机制调用。

如果一切正确,则不需要在此处以编程方式创build单元格。 这一点代码不应该需要:

 // This bit is unnecessary with storyboards: if (newCell == nil) { newCell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: MAINVIEW_CELLIDENTIFIER]; [newCell autorelease]; newCell.selectionStyle = UITableViewCellSelectionStyleNone; } 

希望有所帮助。

阅读@ Firoze的回答后,我解决了我一直困扰着我的问题……并find了另一个解决scheme。 我知道这个问题已经被回答了,但是这可能会帮助别人。

在我的情况下,我做了一些重构(提取一个新的TableViewController),然后我得到零dequeueReusableCellWithIdentifier返回的单元格。

对我来说,修正是为了做到这一点,而不是在我的ViewController didSelectRowAtIndexPath调用alloc/init

 UIStoryboard* sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; MyTableViewController* controller = [sb instantiateViewControllerWithIdentifier: @"MyTableViewController"]; 

(然后我调用[self.navigationController pushViewController:controller animated:YES]; – 不是最干净的方式,但它的工作原理)

表格单元格在被隐藏时只能被重用,所以你应该只有当前在内存中显示的单元格的数量。 你显示了多less个单元格,分配了多less个单元格?

以防万一它可以帮助未来的人…在我的情况下,我忘了在TableView(Storyboard)内容从“静态单元格”更改为“dynamic原型”。

典型原因:

[tableView dequeueReusableCellWithIdentifier: @"id"]; 不匹配Xcode> Attribute Inspector> Table View Cell > Identifier > id