无法识别的选择器发送到实例 - 有人可以帮助我吗?
Posted
技术标签:
【中文标题】无法识别的选择器发送到实例 - 有人可以帮助我吗?【英文标题】:unrecognized selector sent to instance - can someone Help me? 【发布时间】:2017-05-31 10:48:25 【问题描述】:好吧,如果我使用@tituloReceita
将其放在标签上,那么我正在尝试使用 Json 响应设置标签文本,但我必须使用 @ingredientes
如果你采取看这里http://blessing.com.br/aplicativos/receitasJson.php,可以看到@ingredientes
比@tituloReceita
大一点。
代码:
NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://blessing.com.br/aplicativos/receitasJson.php"]];
NSError *error=nil;
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
NSArray *json = dict[@"receitas"];
for (NSDictionary *dic in json)
if ([dic[@"tituloReceita"] isEqualToString:titulo])
self.label1 = [[UILabel alloc] initWithFrame:CGRectMake(25, 50, 150, 20)];
//set the label text
self.label1.numberOfLines = 10;
self.label1.text = [dic objectForKey:@"ingredientes"];
//set the lable font
self.label1.font = [UIFont boldSystemFontOfSize:10.0f];
//se the text alignment
self.label1.textAlignment = NSTextAlignmentCenter;
[sView addSubview:self.label1];
在此之后,应用程序崩溃并记录以下内容:
*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFArray 长度]: 无法识别的选择器发送到实例 0x10c01ad90'
但如果我使用@tituloReceita
所说的另一个,它可以完美运行,这个应用程序就像一本食谱书。
【问题讨论】:
请仔细检查您的 JSON。tituloReceita
是一个字符串,ingredientes
是一个数组。
[dic objectForKey:@"ingredientes"];
它是一个数组而不是一个字符串
@SushilSharma 对不起我的错误我是 ios 和 Objective-c 的新手
[__NSCFArray length]:unrecognized selector
这意味着你调用的某个地方(可能不是直接调用你,而是一个“隐藏”调用)length
对NSArray
对象的方法(你不匹配对象的真实类并认为它可以调用length
,但事实并非如此,因为它是一个NSArray
对象)。通过实践,我们可以说在某处您将 NSArray
对象与 NSString
对象不匹配。精确定位应该给你self.label1.text = [dic objectForKey:@"ingredientes"];
。所以[dic objectForKey:@"ingredientes"];
是NSArray
,而不是NSString
,你的解析是错误的。
【参考方案1】:
根据JSON,keyingredientes
的值是一个Array,不能作为String使用:
如果您想使用所有成分,请尝试:
NSArray *ingredientes = [dic objectForKey:@"ingredientes"];
if (ingredientes != nil)
self.label1.text = [ingredientes componentsJoinedByString:@","];
如果您想使用第一种成分,请尝试:
NSArray *ingredientes = [dic objectForKey:@"ingredientes"];
if (ingredientes != nil && ingredientes.count > 0)
self.label1.text = [ingredientes firstObject];
最后一个问题是:您在循环中创建具有相同框架的标签,这会将所有标签组合在一起。也许您应该为每个标签更改框架以将它们放置在合适的位置。
【讨论】:
那么,我怎样才能把它放在一个uilabel上呢? @YunCHEN 很好的答案,你知道如何更改“,”以使其更清晰和更容易吗? @MatheusRohwedder,试试@"\n"。并记得将标签的 numberOfLines 属性设置为 0。【参考方案2】:来自http://blessing.com.br/aplicativos/receitasJson.php的json。 “ingredientes”键包含一个数组,您将其分配给文本,仅接受字符串值。所以加入数组的对象并制作字符串。就像例如[[dic objectForKey:@"ingredientes"] componentsJoinedByString:@","];
【讨论】:
很好的答案,但你知道如何更改“,”作为换行符以使应用程序清晰? yes 而不是 ,使用 \n 作为换行符。但是你需要让 label.numberOfLines = 0 变成多行。 我无法更改的 Json 代码,如何以编程方式替换它? 替换 [[dic objectForKey:@"ingredientes"] componentsJoinedByString:@","]; with [[dic objectForKey:@"ingredientes"] componentsJoinedByString:@"\n"]; 对不起,我理解错了,我以为你说要改变Json,非常感谢你。以上是关于无法识别的选择器发送到实例 - 有人可以帮助我吗?的主要内容,如果未能解决你的问题,请参考以下文章