我希望有人可以帮助我解决iOS 6上的这个奇怪的崩溃。
我正在构建适用于iOS 6的应用 - iOS 7,我使用MKMapView
并添加了一个MKPointAnnotation
。我还使用自定义MKAnnotationView
来显示我的图钉和标注。在iOS 7上,一切都很美妙。但是,iOS 6我在EXC_BAD_ACCESS
上获得MKMapView:addAnnotation
。一切都在viewDidLoad
完成。
我也测试过2个场景。
如果我在添加注释之前设置MKMapView
委托,则会在iOS 6上崩溃。
如果我在添加注释后设置MKMapView
委托,它在iOS 6上不会崩溃,但是viewForAnnotation
没有被调用,我最终得到的是默认引脚而不是我的自定义引脚和标注。
代码:
-(void)viewDidLoad
{
[super viewDidLoad];
//set delegate
self.mapView.delegate = self;
//lat, long
CGFloat latitude = 40.689249f;
CGFloat longitude = -74.0445f;
//coord, span, region
CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(latitude, longitude);
MKCoordinateSpan span = MKCoordinateSpanMake(0.05f, 0.05f);
MKCoordinateRegion region = MKCoordinateRegionMake(coord, span);
//annotation
MKPointAnnotation annotation = [[MKPointAnnotation alloc] init];
[annotation setTitle:@"title here"];
[annotation setCoordinate:coord];
[self.mapView setRegion:region];
[self.mapView addAnnotation:annotation];//EXC_BAD_ACCESS here (iOS 7 no crash)
}
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
CAnnotationView *annotationView = (CAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:MKAnnotationViewReuseIdentifier];
if (!annotationView)
annotationView = [[CAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:MKAnnotationViewReuseIdentifier];
return annotationView;
}
好吧我发现在iOS 6中为我的CAnnotationView加载自定义nib会导致崩溃。如果我注释掉加载捆绑,那么不会再崩溃。
在iOS 6中继承MKAnnotationView时,不支持nib吗?
-(id)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
if (self){
NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:@"CAnnotationView" owner:self options:nil];
self = [bundle firstObject];
}
return self;
}
这是我创建的一个小测试,可以复制崩溃。在iOS 6上运行会导致崩溃,iOS 7应该会看到放置在MKMapView上的自定义注释。 http://www.levieggert.com/MKMapView/MKMapViewCrashTest.zip
答案 0 :(得分:1)
确定将文件所有者的类更改为CAnnotationView,然后将笔尖中的顶级视图作为子视图添加到插座中。
-(id)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
if (self){
[[NSBundle mainBundle] loadNibNamed:@"CAnnotationView" owner:self options:nil];
[self addSubview:self.view];
}
}