2016-04-03 3 views
1

Я хочу отображать аннотации с использованием lat и lon, lat и lon поступают из JSON (nearStop), и я хранил долготу и широту в два NSArrays. Когда я пытаюсь добавить аннотацию к mapview в цикле for, возникает ошибка EXC_BAD_ACCESS enter image description here Любые помогает?Ошибка EXC_BAD_ACCESS возникает при добавлении аннотации к MKMapView

NSMutableArray *coordinateLongi = [[NSMutableArray alloc]init]; 
for (NSDictionary *stop in nearbyStop) { 
    NSString *longi = stop[@"result"][@"lon"]; 
    if(longi == nil) 
    { 
     NSLog(@"there is no data"); 
    } 
    else 
    { 
     [coordinateLongi addObject:longi]; 
    } 
} 

NSMutableArray *coordinateLatit = [[NSMutableArray alloc]init]; 
for (NSDictionary *stop in nearbyStop) { 
    NSString *latit = stop[@"result"][@"lat"]; 
    if(latit == nil) 
    { 
     NSLog(@"there is no data"); 
    } 
    else 
    { 
     [coordinateLatit addObject:latit]; 
    } 
} 

for(int i = 0; i<coordinateLongi.count;i++) 
{ 
    CLLocationCoordinate2D coord; 
    coord.latitude = [[NSString stringWithFormat:@"%@",[coordinateLongi objectAtIndex:i]] floatValue]; 
    for(int j = 0; j<coordinateLatit.count;j++) 
    { 
     coord.longitude = [[NSString stringWithFormat:@"%@",[coordinateLatit objectAtIndex:i]] floatValue]; 
    } 


    CustomAnnotation *annotObj = [[CustomAnnotation alloc] initWithCoordinate:coord title:@"title" ]; 
    [map addAnnotation:annotObj];//Error occurs here. 
} 

Вот мой customAnnotation.h

#import <MapKit/MapKit.h> 

@interface CustomAnnotation : MKPlacemark 
{ 
    CLLocationCoordinate2D coordinateL; 
    NSString *title; 
    NSString *subtitle; 
    NSString *time; 
} 

@property (nonatomic)CLLocationCoordinate2D coordinateL; 
@property (strong, nonatomic) NSString *title; 
@property (strong, nonatomic) NSString *subtitle; 
@property (strong, nonatomic) NSString *phone; 
@property (strong, nonatomic) NSString *time; 

-(id)initWithCoordinate:(CLLocationCoordinate2D) c title:(NSString *) t subTitle:(NSString *)timed time:(NSString *)tim; 

-(id)initWithCoordinate:(CLLocationCoordinate2D) c title:(NSString *)tit; 



@end 

и customAnnotation.m

#import "CustomAnnotation.h" 

@implementation CustomAnnotation 

@synthesize title; 
@synthesize subtitle; 
@synthesize phone; 
@synthesize time; 
@synthesize coordinateL; 


-(id)initWithCoordinate:(CLLocationCoordinate2D) c title:(NSString *) t subTitle:(NSString *)timed time:(NSString *)tim 
{ 
    self.coordinateL=c; 
    self.time=tim; 
    self.subtitle=timed; 
    self.title=t; 
    return self; 
} 

-(id)initWithCoordinate:(CLLocationCoordinate2D) c title:(NSString *)tit 
{ 
    self.coordinateL=c; 
    self.title=tit; 
    return self; 
} 

@end 

ответ

1

Это не может быть причиной, но это ...

@interface CustomAnnotation : MKPlacemark 
{ 
    CLLocationCoordinate2D coordinateL; 
    NSString *title; 
    NSString *subtitle; 
    NSString *time; 
} 

@property (nonatomic)CLLocationCoordinate2D coordinateL; 
@property (strong, nonatomic) NSString *title; 
@property (strong, nonatomic) NSString *subtitle; 
@property (strong, nonatomic) NSString *phone; 
@property (strong, nonatomic) NSString *time; 

etc.. 

может быть уменьшена до

@interface CustomAnnotation : MKPlacemark 

@property (nonatomic)CLLocationCoordinate2D coordinateL; 
@property (strong, nonatomic) NSString *title; 
@property (strong, nonatomic) NSString *subtitle; 
@property (strong, nonatomic) NSString *phone; 
@property (strong, nonatomic) NSString *time; 

etc... 

, как Тереза ​​нет необходимости объявлять Ивар для свойств.

и эти

@synthesize phone; 
@synthesize time; 
@synthesize coordinateL; 

могут быть удалены, как вам не нужно обобщать свойства, если они не приходят из протокола, который title и subtitle делать в MKAnnotation который MKPlacemark соответствует.

Im немного запутался, почему вы объявляете coordinateL когда MKPlacemark уже определяет coordinate

другой вероятной проблемой является то, что вы не вызывая суперкласс в ваших init методов.

, так что вы, вероятно, нужно это в обоих ваших методах инициализации ...

-(id)initWithCoordinate:(CLLocationCoordinate2D)coord title:(NSString *)title 
{ 
    self = [super initWithCoordinate:coord addressDictionary:nil]; 
    if(self) { 
     self.coordinateL = coord; 
     self.title = title; 
    } 
    return self; 
} 
+0

Спасибо за помощь Уоррен! Я уже решил проблему. То, что я делал, это попытаться отобразить на карте различные типы аннотаций, поэтому меня это смутило. Один тип - близлежащие рестораны, я использовал MKLocalSearchRequest для их поиска и добавления аннотаций. Другой тип - близлежащие остановки, я создаю еще одну аннотацию с супер-классом NSObject и объявляю координату.Теперь я выясняю разницу между NSObject и суперклассом MKPlacemark :) –

0

Я подозреваю, что эти линии являются проблемой:

NSString *longi = stop[@"result"][@"lon"];

и

NSString *longi = stop[@"result"][@"lat"];

, так как переменная stop равна нулю, ИЛИ словарь stop[@"result"] равна нулю. Попытка получить ценность из низового словаря приведет к сбою вашего приложения, но добавление в нуль проверки для словаря (stop или stop[@"result"] в этом случае) должно не допустить его от сбоя, но также даст вам возможность сделать некоторые обработка ошибок для неправильного состояния словаря.

+0

Нах .. я использовал NSLog осмотреть coordinateLatit и coordinateLongi NSArray. Информация lon и lat уже есть. Но когда addAnnovation, ошибка возникает –

+0

застрял на этой проблеме весь день ... –

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