继续从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