I am working on a simple GPS-like app. I created a custom object which extends MKAnnotation which also works fine. I can place it etc, but if I put this piece of code [mpm setCoordinate:loc]; in my code, the app opens and freezes while showing the basic gray-grid (not showing any downloaded map and non of my buttons work either then)
Here is my header:
@interface FirstViewController : UIViewController <MKMapViewDelegate>
{
IBOutlet MKMapView *mapView;
MyPlaceMark *mpm;
}
-(void)locationUpdate:(CLLocation *)location;
-(void)locationError:(NSError *)error;
@end
And here is the piece of code where I try to update things:
-(void)locationUpdate:(CLLocation *)location
{
CLLocationCoordinate2D loc = [location coordinate];
[mpm setCoordinate:loc]; // This line messes it up.
[mapView setCenterCoordinate:loc];
if([mapView showsUserLocation] == NO)
[mapView setShowsUserLocation:YES]; // This does not show my position either?
}
If I comment that line out, the app works fine. I need to update the annotation as it will be my marker for showing the users current location. PS: Without that line, it does center my view – so location is a valid/set variable.
My viewDidLoad looks like this:
- (void)viewDidLoad {
mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
//mapView.showsUserLocation = YES;
[mapView setShowsUserLocation:YES];
mapView.mapType = MKMapTypeStandard;
mapView.delegate = self;
CLLocationCoordinate2D location;
MKCoordinateRegion region;
location.latitude = -33.8;
location.longitude = 18.6;
MKCoordinateSpan span;
span.latitudeDelta = 0.01;
span.longitudeDelta = 0.01;
region.span = span;
region.center = location;
[mapView setRegion:region animated:TRUE];
[mapView regionThatFits:region];
mpm = [[MyPlaceMark alloc] initWithCoordinate:location]; // Creating mpm
[mapView addAnnotation:mpm]; // Adding mpm
[self.view addSubview:mapView];
[super viewDidLoad];
}
Should I re-add mpm after I changed it’s location? Or would it just jump to its new location on the map?
So to recap the question: How can I update the custom MKAnnotation’s location on my mapview?
Thank you for your time!
EDIT: I think the main reason for the crash is the fact that I do not create a setCoordinate method/function in my custom MKAnnotation. How would I override that but keep it same as original?
The error in log-console:
2011-06-09 14:42:40.377 AeroNav[3706:707] -[MyPlaceMark setCoordinate:]: unrecognized selector sent to instance 0x19e0e0
2011-06-09 14:42:40.493 AeroNav[3706:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MyPlaceMark setCoordinate:]: unrecognized selector sent to instance 0x19e0e0'
...
terminate called after throwing an instance of 'NSException'
[mapView setShowsUserLocation:YES]doesn’t update the region that the map shows. You will have to implement the delegate methodsdidUpdateUserLocation:and call thesetRegion:animated:there to move the region to user’s location. Until this is called for the first time, theuserLocationproperty ofMKMapViewis not set.As for the
MKAnnotationthing,MKAnnotationis a protocol. It doesn’t have a default implementation. You will have to provide for all the methods and properties that you’ve agreed to conform to. So declare a property pretty similar to the one in theMKAnnotationprotocol.