2011-06-23 1 views
1

Редактировать:Неисправность получения возвращаемого объектаForKey как NSString

Извините, было уже поздно, когда я разместил вопрос, давая понять, могу ли я сделать это более понятным. В настоящее время мое приложение не имеет ошибок компиляции и работает, но то, что я ожидаю, это разместить контакты на MKMapview. Когда я запускаю его, на карте не отображаются контакты. Когда я исследую консоль, ошибок и указаний нет. Я сузил ошибку вниз по этим двум направлениям:

NSString* lng_coord = [[dict objectForKey:key] description]; 
[CelebsAnnotation setLongitude:[lng_coord doubleValue]]; 

Проблема заключается в том, что я не могу показаться, чтобы получить lng_coord doubleValue дать мне двойное значение, потому что если бы это было, то появятся штырьки. Я знаю это, потому что, если я это сделаю:

[CelebsAnnotation setLongitude:54.39281]; // for example 

тогда на карте появляются контакты. Поэтому, если lng_coord не дает мне doubleValue, это делает , я считаю, что это не должно быть NSString, что означает, что objectForKey не возвращает NSString (хотя у меня есть все основания полагать, что это потому, что я использовал) :

// Use when fetching text data 
NSString *response = [request responseString]; 

, а затем проанализирована эта строка ответа с использованием SBJSON. Я знаю, что я успешно разбор/лат значения LNG из моего ответа JSON, потому что я могу это сделать:

NSLog(@"%@", lng_coord); 

и выводит правильные числовые значения в консоли. Я попытался отличить возвращаемое значение от objectForKey следующим образом:

NSString* lng_coord = (NSString*)[dict objectForKey:key]; 

не имеет успеха. Затем я искал вокруг SO для того, чтобы превратить возвращаемое значение из objectForKey в NSString, и «описание», казалось, было ответом, хотя то, что также не работал для меня.

SO .. чтобы суммировать, мне нужно значение NSString для lng_coord, чтобы я мог получить doubleValue этой строки! Спасибо за ваше время. Ничего, кроме любви к переполнению стека.

Вот мой JSON закодированный ответ от моего PHP скрипт, который в настоящее время анализируется мое приложение:

[ 
{"lng":"49.2796758","lat":"-123.1365125"}, 
{"lng":"49.2695877","lat":"-123.0443507"}, 
{"lng":"50.4547222","lat":"-104.6066667"}, 
{"lng":"49.2696243","lat":"-123.0696036"}, 
{"lng":"49.2688942","lat":"-123.1388003"}, 
{"lng":"49.2796758","lat":"-123.1365125"} 
] 

А вот функция, которая содержит ошибку, которую я описал выше:

- (void)requestFinished:(ASIHTTPRequest *)request 
{ 
// Use when fetching text data 
NSString *response = [request responseString]; 
SBJsonParser *parser = [[SBJsonParser alloc] init]; 
NSArray *pins = [parser objectWithString:response error:nil]; // an array of dictionaries that contain coords 

// loop through the pins array of dictionaries (lng, lat) 
for (int i = 0; i < [pins count]; i++) 
{ 
    NSDictionary *dict = [pins objectAtIndex:i]; 
    for(NSString *key in dict) { 
     if ([key isEqualToString: @"lng"]) { // access of the longitude coord 
      NSString* lng_coord = [[dict objectForKey:key] description]; 
      [CelebsAnnotation setLongitude:[lng_coord doubleValue]];  
     } 
     if ([key isEqualToString:@"lat"]) { // access of the latitude coord 
      NSString* lat_coord = [[dict objectForKey:key] description]; 
      [CelebsAnnotation setLatitude:[lat_coord doubleValue]]; 
     } 
    } 
    // now that you've set the lng/lat, insert the annotation at index i 
    CelebsAnnotation *newAnnotation = [[CelebsAnnotation alloc] init]; // template object for all pins 
    [self.mapAnnotations insertObject:newAnnotation atIndex:i]; 
    [newAnnotation release]; 
    [self.mapView removeAnnotations:self.mapView.annotations]; 
    [self.mapView addAnnotation:[self.mapAnnotations objectAtIndex:i]]; // add annotation 
} 
+0

Непонятно, что происходит. Сбой вашего приложения? Вы получаете 0? – jtbandes

+0

Попробуйте сделать это - 'NSLog (@"% @ ", NSStringFromClass ([[object objectKey: key] class]));' –

+0

Я отредактировал этот вопрос, чтобы уточнить, что я прошу. Любые другие идеи? – winnicki

ответ

4

, что это формат объекта в вашем dict? Если это просто строка, вам не нужно использовать «описание» в

NSString* lng_coord = [[dict objectForKey:key] description]; 

Если вы хотите быть уверены, чтобы иметь NSString, используйте

NSString* lng_coord = (NSString*)[dict objectForKey:key]; 
+0

Я пробовал это без успеха. – winnicki

+0

Вы пытались изменить '' 'for (ключ NSString * в dict)' '' '' 'для (NSString * key в dict.allKeys)' ''? – teriiehina

+0

также, вы пытались напечатать каждый элемент '' 'NSArray * pins'''? Может быть, проблема в другом месте. – teriiehina

0

Я была такая же проблема.

Был поглощен сторонний сервис, который вернул строку в json. Мой собственный сервис возвращал то же самое значение (.Net WCF). Сравнение ключей в словаре не удалось.

Я изменил свой тип возврата на строку, чтобы соответствовать типу третьей стороны, и он работал нормально.

Смежные вопросы