【问题标题】:How can I resolve this 'unrecognized selector sent to instance' error?如何解决此“无法识别的选择器发送到实例”错误?
【发布时间】:2011-02-08 02:56:54
【问题描述】:

错误为Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MObject objectAtIndex:]: unrecognized selector sent to instance。所以,我从中得到的是 MObject 的一个实例(NSObject 的一个子类)正在接收一个它不打算处理的 objectAtIndex: 消息。

当我点击表格行以转到其详细视图时发生错误,该视图由 UIWebView detailWebView 组成。 didSelectRowAtIndexPath的代码如下:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
MObjectDetailVC *mObjectDetailVC = [[MObjectDetailVC alloc] initWithNibName:@"MObjectDetailVC" bundle:nil];
mObjectDetailVC.detailURL = [[NSURL alloc] initWithString:[[[mcData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row] url]];
mObjectDetailVC.title = [[[mcData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row] name];
[self.navigationController pushViewController:mObjectDetailVC animated:YES];
[mObjectDetailVC release];
}

它采用MObject 的选定实例的NSString url 属性并将其转换为详细视图控制器的NSURL,它只执行基本的[detailWebView loadRequest:[NSURLRequest requestWithURL:detailURL]]

如果您有任何建议,我会很高兴听到他们的意见。如果您需要更多信息,请告诉我。

【问题讨论】:

  • mcData的结构是什么?真的是 NSArray 的 NSArray?
  • mcData 是由一堆MObject 组成的NSArray。那么,不是每个项目都是数组中的NSObject,而是每个项目都需要是数组中的NSArray

标签: iphone nsurl didselectrowatindexpath unrecognized-selector


【解决方案1】:

看看mcData的结构。根据您的代码,它及其成员应该是 NSArrays,请确保它们是。

【讨论】:

  • mcData 是由一堆MObject 组成的NSArray。那么,您的意思是不是每个项目都是数组中的NSObject,而是每个项目都需要是数组中的NSArray
  • 代码目前的写法,也就是预期的,是的。请参阅[[mcData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row] 行,它需要一个数组中的数组。
  • 嗯,这不是我想要的。如何更改它以使其不查找嵌套数组,而仅从所选对象中获取 urlname?或者这可能吗?
  • 我猜[mcData objectAtIndex:indexPath.row] 本身就可以解决问题。这假设您有一个包含单个部分的表格。
  • 太棒了,解决了这个错误。不过,我现在还有一个。 “未设置查看出口。”感谢您的帮助!
【解决方案2】:

objectAtIndex:NSArray 上定义。如果MObject 类是NSObject 的子类,则它不会定义objectAtIndex: 方法,这就是错误所说的。

以下两个调用都会导致崩溃:

mObjectDetailVC.detailURL = [[NSURL alloc] initWithString:[[[mcData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row] url]];
mObjectDetailVC.title = [[[mcData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row] name];

确保mcData[mcData objectAtIndex:indexPath.section] 返回NSArray 或其子类的对象。

【讨论】:

    【解决方案3】:

    您可以通过 respondsToSelector 进行检查以防止崩溃:

    您可以在以下位置阅读更多信息 http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html

    在传递特定消息之前进行检查将帮助您避免崩溃。

    【讨论】:

      猜你喜欢
      • 2016-10-08
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多