Карта выноски из plist в Xcode? - PullRequest
0 голосов
/ 26 июля 2011

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

Сбой приложения на основе MapKit при загрузке из plist

У меня проблемы с пониманием, как заставить это работать. Если я жестко закодирую аннотации, я смогу заставить его работать нормально, поэтому я не понимаю, в чем дело. Я думаю, что, вероятно, я получаю доступ к данным в .plst. Мой плист имеет структуру:

<array>
<dict>
    <key>rowData</key>
    <array>
        <dict>
            <key>details</key>
            <string>Some minor info</string>
            <key>latitude</key>
            <strong>53.958756</string>
            <key>Location</key>
            <string>Location One</string>
            <key>lontitude</key>
            <string>-1.07937</string>
        </dict>
       </array>
   </dict>
 </array>

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

-(id)initWithDictionary:(NSDictionary *)dict{
self = [super init];
if(self!=nil){
    coordinate.latitude = [[dict objectForKey:@"latitude"] doubleValue];
    coordinate.longitude = [[dict objectForKey:@"longitude"] doubleValue];
    self.title = [dict objectForKey:@"Location"];
    self.subtitle = [dict objectForKey:@"details"];
}
return self;

Мой viewDidLoad также немного отличается от другого вопроса, на который я ссылался выше. Это выглядит так:

- (void)gotoLocation
{
    // set location as York, UK
    MKCoordinateRegion newRegion;
    newRegion.center.latitude = 53.960025;
    newRegion.center.longitude = -1.082697;
    newRegion.span.latitudeDelta = 0.0012872;
    newRegion.span.longitudeDelta = 0.0159863;

    [self.map setRegion:newRegion animated:YES];
}



 - (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.


    //Set up map
    self.map.mapType = MKMapTypeStandard;   // also MKMapTypeSatellite or MKMapTypeHybrid

    [self gotoLocation];

    // Get the the plist in application bundle
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Places" ofType:@"plist"];

    // Retrieve the plists root element array
    NSArray *array = [[NSArray alloc] initWithContentsOfFile:path];
    NSLog(@"Grabbed locations.plist ok");

    if (array) {

        NSMutableDictionary* myDict = [NSMutableDictionary dictionaryWithCapacity:[array count]];
        for (NSDictionary* dict in array) {
            MapAnnotations* annotation = [[MapAnnotations alloc]initWithDictionary:dict];
            [self.map addAnnotation:annotation];
            [annotation release];
        }
        NSLog(@"The count: %i", [myDict count]);
    }

    else {
        NSLog(@"Plist does not exist");
    }

}

Если кто-нибудь может объяснить мне, где я иду не так и как делать то, что мне нужно, я был бы признателен.

Спасибо за чтение.

1 Ответ

1 голос
/ 26 июля 2011

Во-первых, есть несколько проблем с plist (по крайней мере, с примером в вашем вопросе):

  • <strong> (под ключом latitude) должно быть <string>
  • lontitude должно быть longitude

Далее, ваша структура plist представляет собой массив, содержащий один словарь с одним ключом «rowData» со значением, которое является массивом словарей. Но код перебирает переменную array, которая содержит только самый внешний массив (который содержит только один словарь с ключом "rowData"). Таким образом, в initWithDictionary, objectForKey вызывает все, возвращает nil, потому что ключи, связанные с местоположением, не находятся в крайнем словаре.

Вы хотите либо реструктурировать plist так, чтобы он представлял собой просто массив словарей местоположений (исключите словарь "rowData"), либо обновить код, чтобы получить массив внутри ключа "rowData" и пройти по нему: 1019 *

NSArray *rowDataArray = [[array objectAtIndex:0] objectForKey:@"rowData"];
for (NSDictionary* dict in rowDataArray) //instead of "in array"

Наконец, словарь myDict на самом деле не используется. NSLog его счетчика всегда будет отображать ноль, потому что строка dictionaryWithCapacity просто выделяет память, но не добавляет никаких объектов. Я не вижу необходимости в переменной myDict - я бы удалил ее.

...