Objective c NSMutabel二维数组不工作

Objective c NSMutabel二维数组不工作,objective-c,ios,xcode,Objective C,Ios,Xcode,我正在从远程服务器提取一个二维阵列: - (NSMutableArray*)qBlock{ NSURL *url = [NSURL URLWithString:@"http://wsome.php"]; NSError *error; NSStringEncoding encoding; NSString *response = [[NSString alloc] initWithContentsOfURL:url

我正在从远程服务器提取一个二维阵列:

- (NSMutableArray*)qBlock{

NSURL *url = [NSURL URLWithString:@"http://wsome.php"];
NSError *error;
NSStringEncoding encoding;
NSString *response = [[NSString alloc] initWithContentsOfURL:url 
                                                usedEncoding:&encoding 
                                                       error:&error];
const char *convert = [response UTF8String];
NSString *responseString = [NSString stringWithUTF8String:convert];
NSMutableArray *sample = [responseString JSONValue];

return sample;
}
并将其放入:

NSMutableArray *qnBlock1 = [self qBlock];
NSString *answer1 = [NSString stringWithFormat:[[qnBlock1 objectAtIndex:0]objectAtIndex:1]];
answer = [[NSMutableDictionary alloc]init];
[answer setObject:answer1 forKey:@"1"];

question1.text = [[qnBlock1 objectAtIndex:0] objectAtIndex:0];
label1a.text = [[qnBlock1 objectAtIndex:0]objectAtIndex:2];
label1b.text = [[qnBlock1 objectAtIndex:0]objectAtIndex:3];
label1c.text = [[qnBlock1 objectAtIndex:0]objectAtIndex:4];
label1d.text = [[qnBlock1 objectAtIndex:0]objectAtIndex:5];
我在运行时收到了这个错误

-[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x6c179502012-04-30 09:43:50.794 AppName[371:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x6c17950'

这是因为二维数组的语法问题吗?

您无法返回多维数组。您将返回一个NSDictionary对象数组。您遇到的错误表明您正试图将消息
objectAtIndex:
发送到NSDictionary对象,但该对象失败,因为它没有这样的选择器


更新:

在边聊边聊之后,很明显以下是事实:

  • 用户使用SBJson库解析其php web服务的返回值
  • 返回值为
    • NSDictionary,每个键都是其在列表中(非基于索引)位置的文本表示(@“1”、“2”等),每个值都是NSString对象的NSArray,
    • NSString对象的NSArray(似乎是单个“答案”返回的方式)
  • 下面是我提供的代码,让他遍历返回值:

    NSURL *url = [NSURL URLWithString:@"{his url}"];
    NSError *error;
    NSStringEncoding encoding;
    NSString *response = [[NSString alloc] initWithContentsOfURL:url usedEncoding:&encoding error:&error];
    const char *convert = [response UTF8String];
    NSString *responseString = [NSString stringWithUTF8String:convert];
    NSLog(@"%@", responseString);
    SBJsonParser *parser = [[SBJsonParser alloc] init];
    id sample = [parser objectWithString:responseString];
    if ([sample isKindOfClass:[NSDictionary class]]) {
        for (id item in sample) {
            NSLog(@"%@", [item description]);
            NSArray *subArray = [sample objectForKey:item]; // b/c I know it's an array
            for (NSString *str in subArray) {
                NSLog(@"item: %@", str);
            }
        }
    } else if ([sample isKindOfClass:[NSArray class]]) {
        for (NSString *str in sample) {
            NSLog(@"item: %@", str);
        }
    }
    

    希望能有帮助,J

    你不会得到一个多维数组。您将返回一个NSDictionary对象数组。您遇到的错误表明您正试图将消息
    objectAtIndex:
    发送到NSDictionary对象,但该对象失败,因为它没有这样的选择器


    更新:

    在边聊边聊之后,很明显以下是事实:

  • 用户使用SBJson库解析其php web服务的返回值
  • 返回值为
    • NSDictionary,每个键都是其在列表中(非基于索引)位置的文本表示(@“1”、“2”等),每个值都是NSString对象的NSArray,
    • NSString对象的NSArray(似乎是单个“答案”返回的方式)
  • 下面是我提供的代码,让他遍历返回值:

    NSURL *url = [NSURL URLWithString:@"{his url}"];
    NSError *error;
    NSStringEncoding encoding;
    NSString *response = [[NSString alloc] initWithContentsOfURL:url usedEncoding:&encoding error:&error];
    const char *convert = [response UTF8String];
    NSString *responseString = [NSString stringWithUTF8String:convert];
    NSLog(@"%@", responseString);
    SBJsonParser *parser = [[SBJsonParser alloc] init];
    id sample = [parser objectWithString:responseString];
    if ([sample isKindOfClass:[NSDictionary class]]) {
        for (id item in sample) {
            NSLog(@"%@", [item description]);
            NSArray *subArray = [sample objectForKey:item]; // b/c I know it's an array
            for (NSString *str in subArray) {
                NSLog(@"item: %@", str);
            }
        }
    } else if ([sample isKindOfClass:[NSArray class]]) {
        for (NSString *str in sample) {
            NSLog(@"item: %@", str);
        }
    }
    

    希望能有帮助,J

    我认为从您的错误消息来看,您正在向字典发送objectAtIndex。NSDictionary没有这样的方法。您应该改用objectForKey。

    我认为从您的错误消息来看,您正在将objectAtIndex发送到字典。NSDictionary没有这样的方法。您应该改用objectForKey。

    在将“答案”部分插入NSMutableDictionary之前,我将其转换为NSString。。。我没有直接插入它…我只是在行NSString*answer1=[NSString stringWithFormat:[[qnBlock1 objectAtIndex:0]objectAtIndex:1]]之前设置断点;然后是1.text=[[qnBlock1 objectAtIndex:0]objectAtIndex:0];看看到底是哪条线导致了撞车,然后继续往下看there@Kaan--或者只查看异常回溯中报告的行。在将“答案”部分插入NSMutableDictionary之前,我将其转换为NSString。。。我没有直接插入它…我只是在行NSString*answer1=[NSString stringWithFormat:[[qnBlock1 objectAtIndex:0]objectAtIndex:1]]之前设置断点;然后是1.text=[[qnBlock1 objectAtIndex:0]objectAtIndex:0];看看到底是哪条线导致了撞车,然后继续往下看there@Kaan--或者简单地查看异常回溯中报告的行。最初它是一维数组,并且工作正常。但我不想浪费在连接5组数据所需的次数上。。。所以我决定制作服务器端的二维数组……这很好,但是不管数据是如何进来的,您实际上得到的是一个使用NSDictionary对象填充的NSArray/NSMutableArray,而不是子数组。您可能不打算这样做,但您收到的错误消息表明情况就是这样。您可以尝试询问正在获取的NSDictionary对象,以查看是否可以轻松获取所需内容,而无需重新编写(再次!)web服务。这仅用于测试,因此不建议将其用于最终应用程序。请尝试以下操作:
    for(id key in(NSDictionary*)[qnBlock1 objectAtIndex:0]){NSLog(@“%@”,[dic objectForKey:key]);}
    抱歉,我没有完全编辑我的所有代码<在我的示例中,code>dic是NSDictionary的名称。将
    dic
    更改为
    qnBlock1
    。让我们先来看看它原来是一维数组,它可以工作。但我不想浪费在连接5组数据所需的次数上。。。所以我决定制作服务器端的二维数组……这很好,但是不管数据是如何进来的,您实际上得到的是一个使用NSDictionary对象填充的NSArray/NSMutableArray,而不是子数组。您可能不打算这样做,但您收到的错误消息表明情况就是这样。您可以尝试询问正在获取的NSDictionary对象,以查看是否可以轻松获取所需内容,而无需重新编写(再次!)web服务。这仅用于测试,因此不建议将其用于最终应用程序。请尝试以下操作:
    for(id key in(NSDictionary*)[qnBlock1 objectAtIndex:0]){NSLog(@“%@”,[dic objectForKey:key]);}
    抱歉,我没有完全编辑我的所有代码<在我的示例中,code>dic是NSDictionary的名称。将
    dic
    更改为
    qnBlock1
    。让我们看看您正在处理的JSON的至少一个示例(同时记录您在处理过程中的几个步骤)。您假设NSArray的两个级别中有一个字典,但错误告诉您,您试图将字典视为一个数组。您应该至少向我们展示一个正在处理的JSON示例(以及在过程中的几个步骤中的NSLog)。您假设在NSArray的两个级别中有一个字典,但是错误告诉您您试图将字典视为数组。