iOS 6/7中"无法使用表格单元索引路径"消息的含义是什么?

Nat*_*own 57 uitableview ios ios6 ios7

自从开始用iOS 6(以及iOS 7)编译我的应用程序以来,我已经开始看到这条消息了.我知道UITableViews管理单元格的方式在iOS 6中是不同的,但我不需要修改我的代码以便继续工作.但是我担心这个消息可能指向一些我还没有看到的潜在问题.谁能摆脱任何光明?

mlu*_*own 132

我开始在iOS 7 beta 5以后的日志中显示此错误,包括在iOS 7 GM/Release版本中,同时从未在我的iOS 6应用程序或早期的iOS 7测试版中发生过这种错误.经过大量的实验,我找到了原因:

我正在使用UITableViewCell对象作为节标题视图并将其返回tableView:viewForHeaderInSection:.这似乎是常见的做法,特别是在iOS 5之后,当使用Interface Builder在StoryBoard中将部分标题视图设计为原型表视图单元变得容易时.

当我更改我的应用程序以使用常规UIView子类用于我的节标题视图时,错误消失了,更重要的是,我的表视图停止随机删除节标题!

看起来(因为iOS 7 beta 5)UITableView在内部维护UITableViewCell其视图层次结构中的所有对象及其各自的索引路径的映射.由于节标题(或页脚的表视图标题)没有索引路径,如果UITableViewCell对这些视图使用对象,则表视图在找到UITableViewCell没有索引路径的表时会感到困惑,导致"没有表格单元被重用的索引路径"错误,如果你不走运,在表视图中显示毛刺:

更新:如果您可以访问Apple Dev论坛,请参阅以下内容(我开始):https://devforums.apple.com/message/882042#882042

正如该线程中所建议的那样,如果您不想重新考虑很多因素,可以创建一个UIView包装器UITableViewCell并将其作为节头视图返回.

UIView *view = [[UIView alloc] initWithFrame:[cell frame]];
[view addSubview:cell];

return view;
Run Code Online (Sandbox Code Playgroud)

但是请注意,这种"包装" UIView方法不能很好地与AutoLayout和设备旋转一起使用,因此我建议您使用UIView子类来表示页眉和页脚单元格,而不是UITableViewCell如答案主要部分所述的子类.

  • 作为@mluisbrown建议的替代方案,这对我有用:return cell.contentView; (7认同)
  • 真棒!我正在经历标题消失.这将在未来几天为我节省大量时间.谢谢!那你还能在故事板中设计你的标题吗?你是否只是在故事板设置中将类更改为UIView? (3认同)
  • @ChrisWagner不,我刚刚为标题单元格创建了一个单独的独立XIB文件,然后像这样加载:`NSArray*nibObjects = [[NSBundle mainBundle] loadNibNamed:@"SectionHeader"owner:self options:nil]; SectionHeaderView*sectionHeaderView = nib [0];`据我所知,你不能在StoryBoard中创建一个独立的视图,它不是视图控制器. (2认同)
  • @ChrisWagner另一个似乎也可以工作的方法就是创建一个具有相同框架的`UIView`,然后将你的`UITableViewCell`对象添加为子视图,这样就可以为节头单元创建一个`UIView`包装器. (2认同)

mar*_*idt 41

我将返回UITableViewCell的contentView,而不是创建一个包装器.在storybord中记住约束-jabble

return cell.contentView;
Run Code Online (Sandbox Code Playgroud)

  • Xcode 7.0.1/iOS 8/9(用于Xcode 6)背景颜色丢失,所以我必须回到接受的答案. (2认同)

mpp*_*dev 26

我遇到了同样的问题,我花了几个小时才找到问题.结果我[textField becomeFirstResponder]在设置单元格时调用(这里textField是自定义tableviewcell的一部分); [textField becomeFirstResponder]反过来发布了keyboardWillShow通知,这反过来导致tableview过早地加载自身,从而导致臭名昭着的" 没有索引表单元格的索引路径 "消息.一旦我删除了该调用,问题就消失了.


Rob*_*Rob 16

除了接受的答案(mluisbrown),我需要在标题单元格中添加一个autoresizingMask,因为我的包含一个多行标签,即

UIView *view = [[UIView alloc] initWithFrame:[cell frame]];
cell.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[view addSubview:cell];
return view;
Run Code Online (Sandbox Code Playgroud)


die*_*dez 8

这是一个内部UIKit错误 - 正如Apple自己的开发论坛中提到的那样.它应该在较新版本的xcode中修复,虽然我无法找到有关哪个版本修复此信息的信息.