0

我还在边做边学,所以请,如果这听起来像一个菜鸟问题,那可能就是这样。

我正在尝试遍历 NSDictionary (messeges) 并获取某个键上的值。

当我运行此代码时,我收到以下错误“ * 由于未捕获的异常 'NSRangeException' 导致应用程序终止,原因:'* -[__NSArrayI objectAtIndex:]: index 4 beyond bounds [0 .. 3]'”

NSArray* keys = [messages allKeys];

int count = [keys count] ;
for (int i=0; i < count; i++) {
  for(NSString* key in keys) {
    if ([key isEqualToString:@"messagesinconversation"]) {
        NSArray* arr = [messages objectForKey:key];
        NSString *sentby = [[arr valueForKey:@"sentby"] objectAtIndex:i];

        NSLog (@"%@", sentby);

    }
}
}

有人能指出我正确的方向吗?

4

5 回答 5

2

我认为问题发生在

NSString *sentby = [[arr valueForKey:@"sentby"] objectAtIndex:i];
可能是 arr 数组计数小于键数组计数。但是您正在根据键数运行 for 循环。代替
NSString *sentby = [[arr valueForKey:@"sentby"] objectAtIndex:i]; 
NSLog(@"%@", 发送者);
带有以下代码的代码

for(NSDictionary *dictionary in arr){ 
   NSString *sentby=[dictionary objectForKey:@"sentby"];
   NSLog(@"sentby is %@",sentby);
}
于 2013-09-12T10:54:27.050 回答
0

目前尚不清楚您到底想做什么,但根本原因是数组i的当前索引keys,而不是arr数组。

也许你想要:

NSArray *inconversation = [messages objectForKey:@"messagesinconversation"];
if (inconversation) {
    NSArray *sentBy = [inconversation valueForKey:@"sentby"];
    for (NSString *sender in sentBy) {
        NSLog (@"%@", sender);
    }
}

(当您想要一个特定元素时,为什么还要麻烦遍历字典键?)

于 2013-09-12T10:55:39.940 回答
0

我想问题是你运行两个循环

检查这个,

NSArray* keys = [messages allKeys];

int count = [keys count] ;
for (int i=0; i < count; i++) {
    NSString *key=[keys objectAtIndex:i];
        if ([key isEqualToString:@"messagesinconversation"])
        {
            NSArray* arr = [messages objectForKey:key];
            NSString *sentby = [[arr valueForKey:@"sentby"] objectAtIndex:i];

            NSLog (@"%@", sentby);

        }

}
于 2013-09-12T10:50:10.290 回答
0

问题是 NSString *sentby = [[arr valueForKey:@"sentby"] objectAtIndex:i];

i 大于数组计数,检查 i 值和数组计数。

检索值时最好设置一个 if 条件

if (i <= [array count]) 像这样

于 2013-09-12T10:58:57.130 回答
0

不需要objectAtIndex在这个数组中获得价值。所以请看我编辑的代码

NSArray* keys = [messages allKeys];
  for(NSString* key in keys)
  {
    if ([key isEqualToString:@"messagesinconversation"])
    {
        NSArray* arr = [messages objectForKey:key];
        NSString *sentby = [arr valueForKey:@"sentby"]; // here's your problem. 

        NSLog (@"%@", sentby);

    }
 }
于 2013-09-12T10:54:08.607 回答