Проблема с получением возвращенного objectForKey как NSString - PullRequest
1 голос
/ 23 июня 2011

Edit:

Извините, было поздно, когда я опубликовал вопрос, давайте посмотрим, смогу ли я прояснить это. В настоящее время мое приложение не имеет ошибок компиляции и работает, но я ожидаю, что это место контакты на 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 / lat из моего ответа JSON, потому что я могу сделать это:

NSLog(@"%@", lng_coord);

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

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

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

ТАК .. чтобы подвести итог, мне нужно значение 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
}

Ответы [ 2 ]

4 голосов
/ 23 июня 2011

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

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

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

NSString* lng_coord = (NSString*)[dict objectForKey:key];
0 голосов
/ 19 мая 2012

У меня была та же проблема.

Использовал стороннюю службу, которая возвращала строку в json.Мой собственный сервис возвращал то же значение, что и long (.Net WCF).Ошибка сравнения ключей в словаре.

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

...