什么是“对表单元格没有索引路径被重复使用”的消息在iOS的6/7意思?(What is the me

2019-06-18 11:08发布

自从开始编译我与iOS 6应用程序(和也因为iOS的7)我已经开始看到这条消息。 我知道这UITableViews去管理细胞的方法是在iOS 6中不同的,但我没有必要修改我的代码为它继续工作。 但我担心这条消息可能指向我还没有看到一些潜在的问题。 任何人都可以摆脱任何轻?

Answer 1:

我开始这个错误的iOS 7测试版5显示了在日志中开始,其中包括了iOS 7 GM /发布版本,而从未有它在我的应用程序出现在iOS 6中或更早的iOS 7的测试版。 大量的实验后,我发现了原因:

我使用UITableViewCell对象为我节头的看法,并返回他们tableView:viewForHeaderInSection: 这似乎是常见的做法,特别是因为iOS 5中时,它成为容易设计节头的视图,与界面生成器故事板的原型表视图细胞。

当我改变了我的应用程序只使用普通UIView子类我节头的看法,错误走了,更重要的是,我的表视图停止乱删章节标题!

这样看来,(自的iOS 7测试5) UITableView内部维护所有的映射UITableViewCell在其视图层次和它们各自的索引路径的对象。 由于节头(或页脚的表视图头)没有索引的路径,如果你使用UITableViewCell这些视图对象,表视图会感到困惑,当它找到一个UITableViewCell为它不具有索引路径,从而导致了“表格单元格没有索引路径被重复使用”的错误,如果你在你的表视图倒霉,显示故障:

更新 :如果你有机会获得苹果开发论坛,这里有一个关于它的线程(我开始): https://devforums.apple.com/message/882042#882042

由于在该线程建议,如果你不想再因素多,你可以创建一个UIView周围的包装UITableViewCell并返回,作为节头视图。

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

return view;

但是请注意,这个“包装” UIView方法不会自动版式和设备旋转打得很好,所以我建议您使用UIView页眉和页脚的细胞,而不是一个子类UITableViewCell作为答案的主要部分解释的子类。



Answer 2:

我返回的UITableViewCell的内容查看,而不是创建一个包装的..有约束jabble固定storybord记

return cell.contentView;


Answer 3:

我有同样的问题,我花了几个小时追捕的问题。 原来我打电话[textField becomeFirstResponder]在设置细胞(这里的文本框是一个定制tableviewcell的一部分); [textField becomeFirstResponder]在接通讯息keyboardWillShow通知其进而引起的tableview过早负载本身从而导致臭名昭著的“ 被重用为表格单元没有索引路径 ”的消息。一旦我删除呼叫,问题消失。



Answer 4:

除了接受的答案(mluisbrown),我需要一个autoresizingMask添加到头部单元中,由于矿井包含多行的标签,即

UIView *view = [[UIView alloc] initWithFrame:[cell frame]];
cell.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[view addSubview:cell];
return view;


Answer 5:

这是一个内部的UIKit错误 - 在苹果自己开发论坛提及。 它理应固定在Xcode的较新版本,但我没能找到有关该版本修复了这个信息。



Answer 6:

作为除了我以前的帖子(其中我提到这显然是一个用UIKit中的bug),我能找到我的特殊情况下的解决方法(该消息为相关的一些奇怪的可视化毛刺上表)。

显然,我的自定义单元格的覆盖-(void)setEditing:animated:时间太长,返回。

我以前的代码为:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{   
    [super setEditing:editing animated:animated];
    [self someAdditionalCode];
}

我能够将其更改为修复它:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{   
    [super setEditing:editing animated:animated];

    // DRM: we want to perform the actions from this block in the main thread, but
    // asynchronously to avoid excessive delays which were causing issues.
    //
    dispatch_async(dispatch_get_main_queue(), ^void()
    {
        [self someAdditionalCode];
    });
}


Answer 7:

resignfirstresponder后做我的endupdates解决我的问题(在我的自定义单元格为UITextField)

-(void)textfieldEditDone
{
....

    [textField resignFirstResponder];
    [self.tableView endUpdates];


Answer 8:

我有错误消息出现同样的问题。 据我可以看到它是通过重新加载从由文本字段作为其代表协议的一部分被调用的函数表视图引起的。 即textFieldDidEndEditing - > [controller.tableview重装...]



Answer 9:

为了记录在案,我的iOS 6下运行时遇到了这个消息太看来,一些代码,通过继承或进口有这样的事情:

(NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section {
    NSInteger rows = 0;
    if ([delegate respondsToSelector:@selector(numberOfItemsInSection:)]) {
        rows = [delegate numberOfItemsInSection:section];

        [tableView beginUpdates];
        [tableView endUpdates];
    }
}

当的BeginUpdate:/ endUpdate:序列被删除,问题消失了神奇。



Answer 10:

这显然是一个老问题,但希望这可以帮助任何人谁仍然得到iOS8上的+这个问题,因为这仍然是对于此特定错误的信息,那就顶的问题。

我用PINRemoteImage到图像异步下载到一个UIImageView这是一个自定义的UITableViewCell内。

为了正确地调整行(使用自动布局动态高度细胞),一旦图像就装好,我叫:

self.tableView beginUpdates;
self.tableView endUpdates;

然后我得到了“表格单元格没有索引路径被重复使用”的消息和应用程序被撞毁。 我曾以为PINRemoteImageManagerResult块是在主线程上,但事实证明,这是不是 - 从而确保了开始/结束的更新被称为固定的问题,在主线程。

dispatch_async(dispatch_get_main_queue(), ^(void){
                            [self.tableView beginUpdates];
                            [self.tableView endUpdates];
});


Answer 11:

好吧,我只是用了一天试图弄清楚这一点的大部分时间,所以希望这另一种解释可以节省别人一些时间。

我有一个实现代码如下这有时给这个消息,加载时。 原来,通过KVO通知核心数据对象,而有观点装载射击造成的。 (在观察一个变化,我试过控制器称为reloadData对有问题的实现代码如下。直到认为已经装载完毕未观察对象固定(以前我就开始观察对象,一旦有人通过访问指定)

TLDR:请检查你可能会试图从除主线程以外的东西重新加载数据。



Answer 12:

也许这可以帮助别人:清凉的单表视图单元格我曾经有过这样的错误。 我的意思是像做

NSIndexPath *reloadRow = [NSIndexPath indexPathForRow:1 inSection:2];
[self._mainTableView reloadRowsAtIndexPaths:@[reloadWebViewRow]
                           withRowAnimation:UITableViewRowAnimationFade];

但一不小心,我输入

NSIndexPath *reloadRow = [NSIndexPath indexPathForItem:1 inSection:2];

注意两个indexpaths的区别:一个是与创建indexPathForItem (错误),其他与indexPathForRow (正确的)。 这一切导致的tableView的非常奇怪的行为,并在标题中的错误消息。



Answer 13:

这似乎是,当我试图更新,这是从Web调用回调代码的部分内的UI我的问题被触发。 我通过强迫用户界面更新的主线程上发生的解决。 我用这样的代码。

void runOnMainQueueWithoutDeadlocking(void (^block)(void)){
    if ([NSThread isMainThread])
    {
        block();
    }
    else
    {
        dispatch_sync(dispatch_get_main_queue(), block);
    }
}

我把它称为我的背景的网络电话的成功块内如下。

runOnMainQueueWithoutDeadlocking(^{
    [self.tableView beginUpdates];
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationAutomatic];
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:2] withRowAnimation:UITableViewRowAnimationAutomatic];
    [self.tableView endUpdates];
});


Answer 14:

另一个条件...

这件事发生的时候,不想头,我回到nil

固定:

func tableView(tableView: UITableView,
               titleForHeaderInSection section: Int) -> String? {
    return ""
}


文章来源: What is the meaning of the “no index path for table cell being reused” message in iOS 6/7?