ios [__NSCFNumber 长度]:发送到实例的无法识别的选择器

Posted

技术标签:

【中文标题】ios [__NSCFNumber 长度]:发送到实例的无法识别的选择器【英文标题】:ios [__NSCFNumber length]: unrecognized selector sent to instance 【发布时间】:2014-10-01 09:52:45 【问题描述】:

我创建了一个自定义单元格并在其上放置了按钮 而按钮事件是这样的

   [cell.BtnRequest addTarget:self action:@selector(didTapButton:) forControlEvents:UIControlEventTouchUpInside];

didtapbutton 代码是这样的

 - (void)didTapButton:(id)sender 

    WorkerDetailsVC *wvc=[self.storyboard instantiateViewControllerWithIdentifier:@"workerdetailsvc"];
    NSIndexPath *indepath = [self.tblorderdata indexPathForCell:sender];

    wvc.arrworkarrequest=[arrData objectAtIndex:indepath.row];

    NSLog(@" arr send :%@", wvc.arrworkarrequest);

    wvc.struserid = struserid;

   [self.navigationController pushViewController:wvc animated:YES];

    

在下一页我得到了数组 arrworkarrequest 并且在加载所有下一页后它会显示这样的错误

       2014-10-01 15:08:42.607 demo[2151:60b] -[__NSCFNumber length]: unrecognized selector sent to instance 0x911a860
       2014-10-01 15:08:42.613 dmeo[2151:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber length]: unrecognized selector sent to instance 0x911a860'

【问题讨论】:

请显示您的调用堆栈。 【参考方案1】:

您的问题是 sender 的类型是 UIButton 而不是 UITableViewCell 所以它卡在 [self.tblorderdata indexPathForCell:sender] 中,因为该方法调用需要 UITableViewCell 类型。

您需要找到按钮所在的单元格。您可以使用 while 循环来执行此操作(尽管它有点可怕)。比如:

id obj = sender;
while (![obj isKindOfClass:[UITableViewCell class]]) 
  obj = [sender superview];


[self.tblorderdata indexPathForCell:obj];

这感觉就像是在滥用视图层次结构。

【讨论】:

+1 - 确切地说,您正在将控件事件添加到 cell.BtnRequest,因此是 UIButton BtnRequest,而不是单元格。您也许可以使用 BtnRequest 的超级视图,它应该是单元格 - 我不确定这是否会起作用。 请告诉我更多关于这个的信息,我该怎么做? 如果我在没有数组的情况下执行相同的代码,那么它完全可以工作,所以这是我的大数组的问题,我将 22 个对象与下一页的键一起发送 如果您还没有,我建议您在所有异常上都设置断点,这样您的程序应该在触发问题的调用上停止。【参考方案2】:

如果你直接比较字符串的长度会发生这种情况

例如

NSString *myString = @"2";

使用此语句会产生错误

如果(myString.length==2)

【讨论】:

不,不会的。发生此错误是因为已在 NSNumber 上调用了 length 方法,并且 NSNumber 不响应方法长度。像这样的 (@2).length 可能会出现此错误。由于他没有在这段代码中调用 length 方法,很可能是因为 sender 的类型混淆。 它发生在他的下一个视图控制器被调用之后,所以我相信那里发生了错误。他可能应该添加一个断点并检查他到底在哪里得到了那个异常。

以上是关于ios [__NSCFNumber 长度]:发送到实例的无法识别的选择器的主要内容,如果未能解决你的问题,请参考以下文章

[__NSCFNumber countByEnumeratingWithState:objects:count:]:发送到实例的无法识别的选择器

如何修复 _NSCFNumber 的 iOS 内存泄漏?

iOS报错[__NSCFNumber length]: unrecognized

iOS:寻找 NSDictionary 值时出现错误:[__NSCFNumber isEqualToString:]: unrecognized selector sent to instanc

ios [__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x7a97d4c0'报错

无法将“__NSCFNumber”()类型的值快速转换为“NSArray”