尝试在MKMapView中查找用户位置时出现问题 [英] Problems Trying to Find User Location in MKMapView
问题描述
我在尝试获取用户的当前位置以显示在MKMapView上时遇到问题.这是相关代码:
I am having problems trying to get the user's current position to display on an MKMapView. Here is the relevant code:
标题:
// ParkingMapViewController.m
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
@interface ParkingMapViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate> {
MKMapView *mapView;
CLLocationManager *locationManager;
}
@property (nonatomic, retain) IBOutlet MKMapView *mapView;
@property (nonatomic, retain) CLLocationManager *locationManager;
-(void)loadAnnotations;
-(void)showCurrentLocationButtonTapped:(id)sender;
@end
部分实施:
// ParkingMapViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:100 target:self action:@selector(showCurrentLocationButtonTapped:)];
[self loadAnnotations];
CLLocationCoordinate2D centerCoord = { UCD_LATITUDE, UCD_LONGITUDE };
[mapView setCenterCoordinate:centerCoord zoomLevel:13 animated:NO]; //from "MKMapView+ZoomLevel.h"
}
- (void)showCurrentLocationButtonTapped:(id)sender {
NSLog(@"Showing current location.");
//[self.mapView setShowsUserLocation:YES];
//mapView.showsUserLocation = YES;
//[sender setEnabled:NO]; //TODO: Uncomment and test
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
[locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
[mapView setCenterCoordinate:newLocation.coordinate];
if ([mapView showsUserLocation] == NO) {
[mapView setShowsUserLocation:YES];//when this line is commented, there is no problem
}
[mapView setCenterCoordinate:newLocation.coordinate zoomLevel:13 animated:YES];
}
- (void)viewDidUnload {
[super viewDidUnload];
[mapView setShowsUserLocation:NO];
}
- (void)dealloc {
[locationManager release];
[mapView release];
[super dealloc];
}
运行该应用程序时,地图视图显示的注释和所有内容都很好,但是当按下当前位置按钮时,地图会重新居中到新位置(稍作移动),并在几分之一秒后显示,它崩溃了.当我注释掉[mapView setShowsUserLocation:YES];
时没有问题,但是否则它将在控制台中吐出此错误:
When running the application, the map view displays just fine with the annotations and everything, but when the current location button is pressed, the map re-centers to its new location(slight move) and a fraction of a second later, it crashes. When I comment out [mapView setShowsUserLocation:YES];
there is no problem, but otherwise it spits out this error in the console:
2010-11-30 22:57:20.657 Parking[53430:207] -[MKUserLocation annotationType]: unrecognized selector sent to instance 0x78427f0
2010-11-30 22:57:20.659 Parking[53430:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MKUserLocation annotationType]: unrecognized selector sent to instance 0x78427f0'
*** Call stack at first throw:
(
0 CoreFoundation 0x0266ab99 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x027ba40e objc_exception_throw + 47
2 CoreFoundation 0x0266c6ab -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3 CoreFoundation 0x025dc2b6 ___forwarding___ + 966
4 CoreFoundation 0x025dbe72 _CF_forwarding_prep_0 + 50
5 Parking 0x00003ddb -[ParkingMapViewController mapView:viewForAnnotation:] + 64
6 MapKit 0x023a8130 -[MKAnnotationContainerView _addViewForAnnotation:] + 175
7 MapKit 0x023a2b2a -[MKAnnotationContainerView _addViewsForAnnotations:animated:] + 251
8 MapKit 0x0239e657 -[MKAnnotationContainerView showAddedAnnotationsAnimated:] + 137
9 MapKit 0x0237837c -[MKMapView _showAddedAnnotationsAndRouteAnimated:] + 102
10 MapKit 0x02376a88 -[MKMapViewInternal delayedShowAddedAnnotationsAnimated] + 191
11 Foundation 0x000571c9 __NSFireTimer + 125
12 CoreFoundation 0x0264bf73 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19
13 CoreFoundation 0x0264d5b4 __CFRunLoopDoTimer + 1364
14 CoreFoundation 0x025a9dd9 __CFRunLoopRun + 1817
15 CoreFoundation 0x025a9350 CFRunLoopRunSpecific + 208
16 CoreFoundation 0x025a9271 CFRunLoopRunInMode + 97
17 GraphicsServices 0x02f4900c GSEventRunModal + 217
18 GraphicsServices 0x02f490d1 GSEventRun + 115
19 UIKit 0x002cfaf2 UIApplicationMain + 1160
20 Parking 0x000020e0 main + 102
21 Parking 0x00002071 start + 53
)
terminate called after throwing an instance of 'NSException'
Google搜索已表明这很可能是IB问题,但我无法发现它.这是我在IB中设置的屏幕:
Googling has indicated that this is most likely an IB problem but I have not been able to spot it. Here is a screen of my set up in IB:
任何帮助将不胜感激.谢谢!
Any help whatsoever will be very much appreciated. Thanks!
推荐答案
问题似乎出在viewForAnnotation
方法中.代码试图在MKUserLocation annotation
上调用annotationType
(没有这种方法).
The problem looks like it is in the viewForAnnotation
method. The code is trying to call annotationType
on the MKUserLocation annotation
(which doesn't have such a method).
在viewForAnnotation
中,它应该检查请求view
的注释类型并进行相应的处理.
In viewForAnnotation
, it should check what kind of annotation the view
is being requested for and handle accordingly.
但是,如果使用的是MKMapView
,则无需使用CLLocationManager
即可获得用户的current location
.只需将showsUserLocation
设置为YES
,就会使map view
在用户所在的位置显示一个蓝点.
However, if you are using the MKMapView
, you don't need to use CLLocationManager
to get the user's current location
. Just setting showsUserLocation
to YES
will make the map view
show a blue dot where the user is located.
在任何一种情况下,viewForAnnotation
方法都需要首先检查annotation class
类型.像这样的东西应该放在顶部:
In either case, the viewForAnnotation
method needs to check the annotation class
type first. Something like this should be at the top:
- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation
{
if ([annotation isKindOfClass:MKUserLocation.class]) {
//it's the built-in user location annotation, return nil to get default blue dot...
return nil;
}
//handle your custom annotations...
}
这篇关于尝试在MKMapView中查找用户位置时出现问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!