UITableView 错误访问在 dequeueReusableCellWithIdentifier 与 Storyboard (iOS5) 上崩溃

Posted

技术标签:

【中文标题】UITableView 错误访问在 dequeueReusableCellWithIdentifier 与 Storyboard (iOS5) 上崩溃【英文标题】:UITableView bad access crashes on dequeueReusableCellWithIdentifier with Storyboard (iOS5) 【发布时间】:2013-07-17 14:38:58 【问题描述】:

我在我正在制作的一个新应用程序中使用 Storyboards,并且在我的大多数视图控制器中都有一个表格视图,它们的设置几乎彼此相同;使用原型单元格,唯一的单元格标识符,所有 UI 方面都几乎相同。代表和数据源都正确连接。该应用程序在 ios6 和最新的 iOS7 beta 上完美运行,问题是 2 个视图控制器在 iOS5 下崩溃。

调用dequeueReusableCellWithIdentifier时,以下委托方法发生崩溃(错误访问)。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CellIdentifier = @"MoreCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...

    // Rest of code snipped ...


错误消息各不相同,从根本没有,到以下任何一种:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_UITableViewReorderingSupport removeFromSuperview]: unrecognized selector sent to instance 0x2a3e20'

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CALayer removeFromSuperview]: unrecognized selector sent to instance 0x2b9f90'

还有第三个错误涉及NSInvocation removeFromSuperview,但我不再得到这个。

我在故事板的笔尖中看不到任何明显的问题。正如我之前所说,它们的配置几乎完全相同,因此这种崩溃只发生在某些视图控制器上是没有意义的。我也没有勾选自动布局,所以这不是问题。

如果我以老式方式(预故事板)创建单元格,它可以正常工作。但我不想这样做,我也不应该这样做,因为使用故事板的意义不大......

if (cell==nil) 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
    cell.textLabel.textColor = [UIColor colorWithRed:(100/255.0f) green:(150/255.0f) blue:(50/255.0f) alpha:1.0];
    cell.textLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:17.0];
    cell.detailTextLabel.textColor = [UIColor colorWithRed:(85/255.0f) green:(85/255.0f) blue:(85/255.0f) alpha:1.0];
    cell.detailTextLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:15.0];

如果我注释掉前面的 dequeueReusableCellWithIdentifier 行,上面的内容就可以正常工作。

所以看来问题一定出在故事板中,但是当我将它与工作正常的视图控制器进行比较时,我看不出有什么问题。

更新:

发布此问题后,我删除了一个有问题的视图控制器并从头开始重新添加。在这样做的过程中,我找到了问题的根本原因——将视图连接到单元格以获取其selectedBackgroundView。这个确切的视图在我的应用程序的其他表中使用得很好,但是在这个特定的表上它会导致如上所述的崩溃,我完全不知道为什么。无论如何,我没有任何代码可以修改它。它只是连接在笔尖中,就是这样......

我可以通过在代码中创建 selectedBackgroundView 来解决这个问题,但我仍然不明白这有什么不同。

【问题讨论】:

【参考方案1】:

你说你在别处用过这个。如果您从其他单元复制了 GUI 元素,那么您可能忘记删除复制的插座连接器。逐一选择元素进行检查,然后检查 Connections Inspector 中显示的内容。

【讨论】:

这正是发生在我身上的事情。当我将 tableview 中的原型单元格数量增加到 3 时,它会复制其中一个已经存在的单元格。正如你所说,缺少一个出口。谢谢!

以上是关于UITableView 错误访问在 dequeueReusableCellWithIdentifier 与 Storyboard (iOS5) 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:索引超出范围的两个自定义单元格

Сould not dequeue a view of kind

swift中的核心数据值访问错误

算法基础

算法基础

为啥 dequeue() 占用这么多处理器时间?