Сбой приложения на основе MapKit при загрузке из plist - PullRequest
1 голос
/ 09 апреля 2011

Я пишу программу, которая использует MapKit для отображения карты, которая будет загружать пользовательские аннотации из файла plist. Каждая аннотация представляет собой элемент словаря в корневом массиве с заголовком, подзаголовком, широтой и долготой. Когда я жестко запрограммировал аннотации для целей тестирования, программа работала прекрасно. Но с добавлением класса MapDemoAnnotation и моей попыткой чтения в списке свойств программа вылетает при запуске.

Вот моя реализация аннотации:

#import "MapDemoAnnotation.h"

@implementation MapDemoAnnotation

@synthesize coordinate;
@synthesize title;
@synthesize subtitle;

-(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:@"name"];
        self.subtitle = [dict objectForKey:@"desc"];
    }
    return self;
}

-(void)dealloc{
    [title release];
    [subtitle release];
    [super dealloc];
}
@end 

Я предполагаю, что проблема с методом viewDidLoad в моем классе RootViewController.

- (void)viewDidLoad {
    [super viewDidLoad];
    MKMapView *mapView = (MKMapView*)self.view;
    mapView.delegate = self;
    mapView.mapType=MKMapTypeHybrid;
    CLLocationCoordinate2D coordinate;
    coordinate.latitude = 39.980283;
    coordinate.longitude = -75.157568;
    mapView.region = MKCoordinateRegionMakeWithDistance(coordinate, 2000, 2000);

    //All the previous code worked fine, until I added the following...
    NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Locations" ofType:@"plist"];
    NSData* data = [NSData dataWithContentsOfFile:plistPath];
    NSMutableArray* array = [NSPropertyListSerialization propertyListFromData:data
                                                             mutabilityOption:NSPropertyListImmutable
                                                                       format:NSPropertyListXMLFormat_v1_0
                                                             errorDescription:nil];
    if (array) {
        NSMutableDictionary* myDict = [NSMutableDictionary dictionaryWithCapacity:[array count]];
        for (NSDictionary* dict in array) {
            MapDemoAnnotation* annotation = [[MapDemoAnnotation alloc]initWithDictionary:dict];
            [mapView addAnnotation:annotation];
            [annotation release];
             }
             NSLog(@"The count: %i", [myDict count]);
    }

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

Программа аварийно завершает работу по причинам, которые я не могу понять, но я полагаю, что я сделал что-то не так при чтении в списке свойств или в классе MapDemoAnnotation. Я что-то упускаю или совершаю ошибку новичка? Мой код в основном заимствован, так что я могу быть далеко от базового подхода к нему.

Заранее спасибо!

1 Ответ

1 голос
/ 09 апреля 2011

Третий параметр в вызове propertyListFromData неверен. Компилятор должен выдавать вам предупреждение «делает указатель из целого числа без приведения», потому что параметр формата ожидает указатель на переменную NSPropertyListFormat (поэтому метод может вернуть формат вам). Так что вам нужно сделать:

NSPropertyListFormat propertyListFormat;
NSMutableArray* array = [NSPropertyListSerialization 
    propertyListFromData:data 
    mutabilityOption:NSPropertyListImmutable 
    format:&propertyListFormat 
    errorDescription:nil];

Однако в документации упоминается, что вышеуказанный метод устарел, и вместо него следует использовать propertyListWithData:options:format:error:.


Однако , гораздо проще просто вызвать метод initWithContentsOfFile: NSArray:

NSString *plistPath = [[NSBundle mainBundle] pathForResource...

NSArray *array = [[NSArray alloc] initWithContentsOfFile:plistPath];

if (array) {
    //your existing code here...
}
else {
    NSLog(@"Plist does not exist");
}

[array release];
...