UITableViewCell indexPathForCell:iOS 7 上的应用程序崩溃

Posted

技术标签:

【中文标题】UITableViewCell indexPathForCell:iOS 7 上的应用程序崩溃【英文标题】:UITableViewCell indexPathForCell: crashing app on iOS 7 【发布时间】:2013-06-28 21:27:13 【问题描述】:

在我的 UITableView 上的 tableView:cellForRowAtIndexPath 方法中,我有以下代码:

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

    static NSString *CellIdentifier = @"Cell";
//    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    NSLog(@"Ok");
    UITableViewCell *cell = [UITableViewCell configureFlatCellWithColor:[UIColor carrotColor] selectedColor:[UIColor sunflowerColor] style:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    NSArray *listaDeEncuestas = [defaults objectForKey:@"encuestas"];
    NSDictionary *dict = [listaDeEncuestas objectAtIndex:indexPath.row];

    cell.cornerRadius = 5.0f;
    cell.separatorHeight = 0.0f;

    cell.textLabel.font = [UIFont boldFlatFontOfSize:17];
    cell.textLabel.textColor = [UIColor cloudsColor];

    cell.textLabel.text = [dict valueForKey:@"encuesta"];
    return cell;

执行此行时,应用程序在模拟器中崩溃:

UITableViewCell *cell = [UITableViewCell configureFlatCellWithColor:[UIColor carrotColor] selectedColor:[UIColor sunflowerColor] style:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

这是日志输出:

2013-06-28 16:02:49.702 Encuestas[5447:a0b] -[UITableViewCell indexPathForCell:]: unrecognized selector sent to instance 0xad77ca0
2013-06-28 16:05:18.311 Encuestas[5447:3c0b] CFNetwork SSLHandshake failed (-9806)
2013-06-28 16:05:20.171 Encuestas[5447:a0b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableViewCell indexPathForCell:]: unrecognized selector sent to instance 0xad77ca0'
*** First throw call stack:
(0x21449b8 0x1ec58b6 0x21e0c13 0x2134cfb 0x21348de 0x13a98 0x115553a 0x1ed781f 0x4c2974 0x4b67ee 0x4c28bf 0x12032b2 0x1130062 0x112ec52 0x112eb24 0x112ebac 0x112dc6f 0x112dbd1 0x112e91b 0x1131e42 0x11f6442 0x11281b9 0x1128334 0x112859e 0x1132697 0x10e8824 0x10e9b5e 0x10ffa6c 0x10fffd9 0x10eb7d5 0x25f5906 0x25f5411 0x20c03e5 0x20c011b 0x20eab30 0x20ea10d 0x20e9f3b 0x10e92b1 0x10eb4eb 0xd07d 0x2d5d725)
libc++abi.dylib: terminating with uncaught exception of type NSException

代码在 ios 6 中运行良好,所以我想知道,为什么这会在 iOS 7 上崩溃?我在文档中遗漏了什么吗?

【问题讨论】:

对于仍在保密协议下的 iOS7 的问题,请访问 Apple 开发者论坛。但是你确实有一个很好的有用的错误消息,它可以告诉你到底出了什么问题。 UITableViewCell 从未响应选择器 indexPathForCell。这是一个 UITableView 方法。 @geraldWilliam 谢谢! 【参考方案1】:

关于 iOS 7 我不能说什么,因为 NDA 和所有内容,但是如果你查看 FUICellBackgroundView 类,你会注意到第 30 行的以下内容,然后是 indexPathForCell: 的调用,这就是您的应用崩溃了:

UITableView* tableView = (UITableView*)self.superview.superview;
NSIndexPath* indexPath = [tableView indexPathForCell:(UITableViewCell*)self.superview];

来源:https://github.com/Grouper/FlatUIKit/blob/52a283435801e4fd45d9d6835743d7b0caa40db5/Classes/ios/FUICellBackgroundView.m#L30

现在,问题出现了,无法保证 UITableView 和它所包含的 UITableViewCell 的视图层次结构,并且看起来 FlatUIKit 正在对此做出不正确的假设。最简单的修复可能会添加检查返回的视图是否为UITableView,如果不是,则简单地沿着层次结构向上走,直到您位于窗口或房屋表视图(在第一种情况下,抛出异常)。

分叉,添加检查,提交拉取请求,很高兴你那天为开源做了一些事情:)

【讨论】:

【参考方案2】:

即使您使用的是 FlatUIKit,实现也没有任何问题。问题发生在框架内部的以下代码行 CFNetwork SSLHandshake 中,当您尝试连接到 SSL 服务器但握手失败时发生。您是否通过网络获取一些数据以将其呈现给 tableview?如果你是,那么你需要看看你是否从服务器端接收到东西。

【讨论】:

-1 请仔细阅读错误信息。尤其是提到引发的异常终止应用程序的那个。 确实是的,但如果 cellForRowAtIndexPath 内出现任何问题,它会在 [UITableViewCell indexPathForCell] 处引发异常,请验证它,然后请投反对票。除了请查看 FlatUIKit 实现之外,我已经对其进行了验证。 @Idindu 抱歉,不打算删除反对票。 SSL 握手在引发异常前几乎两秒失败,来自失败的 SSL 握手的代码路径不太可能以引发的异常结束。此外,如果您查看该方法,您会发现其中没有任何网络代码。 但是你没有注意到在握手失败之前执行了以下代码行 "2013-06-28 16:02:49.702 Encuestas[5447:a0b] -[UITableViewCell indexPathForCell:]"跨度> 这发生在 分钟 之前...请在回答之前阅读完整的问题以及附加的错误消息和代码。【参考方案3】:

iOS 7 "configureFlatCellWithColor" in UITableViewCell 中没有这样的方法,您应该使用以下实现

static NSString *CellIdentifier = @"TableViewCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]

if (cell == nil) 


    cell = [[UITableViewCell alloc] initWithStyle:UITableViewStylePlain reuseIdentifier:CellIdentifier];

【讨论】:

我正在使用 FlatUIKit,这就是该方法的来源。【参考方案4】:

这应该可以解决问题。

if ([[[UIDevice currentDevice] systemVersion] floatValue] == 7.0)

    tableView = (UITableView *)cell.superview.superview.superview;


else

     tableView = (UITableView *)cell.superview;

【讨论】:

以上是关于UITableViewCell indexPathForCell:iOS 7 上的应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

给定 UITableViewCell 的 indexPath,加载该特定单元格

从 -tableView:cellForRowAtIndexPath: 计算“indexPath”处的自定义 UITableViewCell 高度:?

特定 UITableViewCell 的 indexPath 始终为 nil

UITableViewCell 怎么知道自己的 indexPath?

UITableViewCell 问题 indexPath.row 无法正确显示

按下按钮时在 UITableViewCell 中查找按钮的 indexPath?