无法识别的选择器发送到实例 - 有人可以帮助我吗?

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 这意味着你调用的某个地方(可能不是直接调用你,而是一个“隐藏”调用)lengthNSArray 对象的方法(你不匹配对象的真实类并认为它可以调用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,非常感谢你。

以上是关于无法识别的选择器发送到实例 - 有人可以帮助我吗?的主要内容,如果未能解决你的问题,请参考以下文章

UISwipeGesture '发送到实例的无法识别的选择器'

无法识别的选择器发送到实例

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

无法识别的选择器发送到实例

控制器视图停止动画无法识别的选择器发送到实例

Monotouch - [NSConcreteValue doubleValue]:发送到实例的无法识别的选择器