Dim*_*tri 3 iphone mkpinannotationview ios
我在iOS上的mapView上显示我的MKPinAnnotationView时遇到问题.我收到此错误,但我不明白错误的来源:"EXC_BAD_ACCESS".我的代码似乎很好:
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
MKPinAnnotationView *pv = [[MKPinAnnotationView alloc] init];
[pv setPinColor:MKPinAnnotationColorGreen];
[pv setCanShowCallout:YES];
[pv setRightCalloutAccessoryView:[UIButton buttonWithType:UIButtonTypeDetailDisclosure]];
return pv;
Run Code Online (Sandbox Code Playgroud)
}
当我为应用程序设置断点时,这是我使用gdb的控制台显示:
continue
Current language: auto; currently objective-c
Program received signal: “EXC_BAD_ACCESS”.
(gdb) bt
#0 0x023d1dfe in -[MKPinAnnotationView _setPinType:] ()
#1 0x0000324c in -[iSouvenirView mapView:viewForAnnotation:] (self=0x761abe0, _cmd=0x24221fd, mapView=0x7613410, annotation=0x761d360) at /Users/m2sar/iSouvenir/iSouvenirView.m:125
#2 0x02398130 in -[MKAnnotationContainerView _addViewForAnnotation:] ()
#3 0x02392b2a in -[MKAnnotationContainerView _addViewsForAnnotations:animated:] ()
#4 0x0238e657 in -[MKAnnotationContainerView showAddedAnnotationsAnimated:] ()
#5 0x0236837c in -[MKMapView _showAddedAnnotationsAndRouteAnimated:] ()
#6 0x02367cc8 in -[MKMapView mapTileViewDidFinishRendering:] ()
#7 0x023e7ae0 in -[MKMapTileView _didFinishRendering] ()
#8 0x000471c9 in __NSFireTimer ()
#9 0x025cff73 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ ()
#10 0x025d15b4 in __CFRunLoopDoTimer ()
#11 0x0252ddd9 in __CFRunLoopRun ()
#12 0x0252d350 in CFRunLoopRunSpecific ()
#13 0x0252d271 in CFRunLoopRunInMode ()
#14 0x0326000c in GSEventRunModal ()
#15 0x032600d1 in GSEventRun ()
#16 0x002bfaf2 in UIApplicationMain ()
#17 0x00002388 in main (argc=1, argv=0xbffff070) at /Users/m2sar/iSouvenir/main.m:14
(gdb)
Run Code Online (Sandbox Code Playgroud)
错误发生在代码的第二行.有什么建议吗?
谢谢你的帮助
小智 5
您必须使用初始化注释视图initWithAnnotation:reuseIdentifier:.例如:
MKPinAnnotationView *pv = [[[MKPinAnnotationView alloc]
initWithAnnotation:annotation reuseIdentifier:@"annot"] autorelease];
Run Code Online (Sandbox Code Playgroud)
但是,您还应该dequeueReusableAnnotationViewWithIdentifier首先通过调用来利用注释视图重用.
编辑:
在MKAnnotationView的文档中,标题为"重用注释视图"的段落解释了您应该使用的原因dequeueReusableAnnotationViewWithIdentifier.所以viewForAnnotation的代码如下所示:
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
static NSString *myAnnotationIdentifier = @"annot";
MKPinAnnotationView *pv = (MKPinAnnotationView *)[mapView
dequeueReusableAnnotationViewWithIdentifier:myAnnotationIdentifier];
if (!pv)
{
pv = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:myAnnotationIdentifier] autorelease];
[pv setPinColor:MKPinAnnotationColorGreen];
[pv setCanShowCallout:YES];
[pv setRightCalloutAccessoryView:[UIButton buttonWithType:UIButtonTypeDetailDisclosure]];
}
else
{
//we're re-using an annotation view
//update annotation property in case re-used view was for another
pv.annotation = annotation;
}
return pv;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1579 次 |
| 最近记录: |