/ / mkmap si arresta in modo anomalo quando si tenta di ottenere la distanza dalla posizione dell'utente per bloccare sulla mappa - iphone, distanza, mkannotation, mkpinannotationview, posizione dell'utente

mkmap si arresta in modo anomalo quando si tenta di ottenere la distanza dalla posizione dell'utente per bloccare sulla mappa - iphone, distanza, mkannotation, mkpinannotationview, posizione dell'utente

Per qualche motivo ogni volta che faccio clic sul mio pin l'app si blocca. non ci sono errori o avvisi nel mio codice. Succede solo quando provo a ottenere la distanza da userLocation al pin. trova il mio errore?

@implementation FirstViewController
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
mapView.showsUserLocation = YES;

[super viewDidLoad];
}
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation   {

[self showPin];
[self updateLocation];
}
-(IBAction) updateLocation{
mapView.showsUserLocation = YES;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}


- (void)didReceiveMemoryWarning
{
// Releases the view if it doesn"t have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc. that aren"t in use.
}


- (void)viewDidUnload
{
[super viewDidUnload];

// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}


-(IBAction)setMap:(id)sender{
switch(((UISegmentedControl *)sender).selectedSegmentIndex){
case 0:
{
mapView.mapType = MKMapTypeStandard;
break;
}
case 1:
{
mapView.mapType = MKMapTypeSatellite;
break;
}
case 2:
{
mapView.mapType = MKMapTypeHybrid;
break;
}

}}
- (void)dealloc
{
[super dealloc];
}
- (MKAnnotationView *)mapView:(MKMapView *)mv viewForAnnotation:(id <MKAnnotation>)annotation {
MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"pinView"];
if (!pinView) {
pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"pinView"] autorelease];
pinView.pinColor = MKPinAnnotationColorRed;
pinView.animatesDrop = YES;
pinView.canShowCallout = YES;


UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
pinView.rightCalloutAccessoryView = rightButton;
} else {
pinView.annotation = annotation;
}
if (annotation == mapView.userLocation){
return nil; //default to blue dot
}
return pinView;
}
-(IBAction) showPin{
//MOST CODE WILL BE INSERTED HERE!
//instructions

CLLocation *usersLocation = [[CLLocation alloc]initWithLatitude:mapView.userLocation.coordinate.latitude longitude:mapView.userLocation.coordinate.longitude];
MKCoordinateRegion region;
MKCoordinateSpan span;
span.latitudeDelta=0.2;
span.longitudeDelta=0.2;
//ignore above
//always declare location as companyCity
//if more than one in one city then add a number i.e. companyCity2
//chili in mobile alabama
CLLocationCoordinate2D chiliAuburn = mapView.userLocation.coordinate;

chiliAuburn.latitude = 32.606434 ;
chiliAuburn.longitude = -85.484025;
region.span=span;
region.center=chiliAuburn;
CLLocation *chiliAuburnLocation = [[CLLocation alloc] initWithLatitude:chiliAuburn.latitude longitude:chiliAuburn.longitude];
if(chiliAuburnAlabama != nil) {
[mapView removeAnnotation:chiliAuburnAlabama];
[chiliAuburnAlabama release];
chiliAuburnAlabama = nil;
}

chiliAuburnAlabama = [[AddressAnnotation alloc] initWithCoordinate:chiliAuburn];
[chiliAuburnAlabama setTitle:@"Chili Yogurt Café"];
double distanceMiles = ([usersLocation distanceFromLocation:chiliAuburnLocation]/1609.334);
[chiliAuburnAlabama setSubTitle:[NSString stringWithFormat:@"%.2fm", distanceMiles]];
//[chiliAuburnAlabama setSubTitle:@"TEST"];
[mapView addAnnotation:chiliAuburnAlabama];
[chiliAuburnAlabama release];
//tutti frutti homewood alabama
CLLocationCoordinate2D tuttifruttiHomewood = mapView.userLocation.coordinate;

tuttifruttiHomewood.latitude = 33.479775 ;
tuttifruttiHomewood.longitude = -86.790977;
region.span=span;
region.center=tuttifruttiHomewood;

if(tuttifruttiHomewoodAlabama != nil) {
[mapView removeAnnotation:tuttifruttiHomewoodAlabama];
[tuttifruttiHomewoodAlabama release];
tuttifruttiHomewoodAlabama = nil;
}

tuttifruttiHomewoodAlabama = [[AddressAnnotation alloc] initWithCoordinate:tuttifruttiHomewood];
[tuttifruttiHomewoodAlabama setTitle:@"Tutti Frutti"];
[tuttifruttiHomewoodAlabama setSubTitle:@"YOUR RATING HERE"];
[mapView addAnnotation:tuttifruttiHomewoodAlabama];


//ignore below
[mapView setRegion:region animated:TRUE];
[mapView regionThatFits:region];

}
- (void)mapView:(MKMapView *)mv didAddAnnotationViews:(NSArray *)views {
for(MKAnnotationView *annotationView in views) {
if(annotationView.annotation == mv.userLocation) {
MKCoordinateRegion region;
MKCoordinateSpan span;

span.latitudeDelta=0.1;
span.longitudeDelta=0.1;

CLLocationCoordinate2D location=mv.userLocation.coordinate;

region.span=span;
region.center=location;

[mv setRegion:region animated:TRUE];
[mv regionThatFits:region];
}

}
}



@end

GNU gdb 6.3.50-20050815 (versione Apple gdb-1518) (sab 12 febbraio 02:52:12 UTC 2011) Copyright 2004 Free Software Foundation, Inc. GDB è un software gratuito, coperto dalla GNU General Public License, e tu lo sei benvenuto a cambiarlo e / o distribuirne copie a determinate condizioni. Digita "mostra copia" per vedere le condizioni. Non esiste assolutamente alcuna garanzia per GDB. Digitare "mostra garanzia" per i dettagli. Questo GDB è stato configurato come "x86_64-apple-darwin". Si collega al processo 23386. 02/06/2011 00: 39: 46.146 YogurtStoreLocator [23386: 207] 32.606434, -85.484025 02/06/2011 00: 39: 46.148 YogurtStoreLocator [23386: 207] 33.479775, -86.790977 02/06/2011 00: 39: 53.121 YogurtStoreLocator [23386: 207] - [NSCFNumber stringByStandardizingWhitespace]: selettore non riconosciuto inviato all'istanza 0x587b2d0 02/06/2011 00: 39: 53.123 YogurtStoreLocator [23386: 207] * Terminazione dell'app a causa di un'eccezione non rilevata "NSInvalidArgumentException", motivo: "- [NSCFNumber stringByStandardizingWhitespace]: selettore non riconosciuto inviato all'istanza 0x587b2d0" * Chiama stack al primo lancio: ( 0 CoreFoundation 0x00fca5a9 exceptionPreprocess + 185 1 libobjc.A.dylib 0x0111e313 objc_exception_throw + 44 2 CoreFoundation 0x00fcc0bb - [NSObject (NSObject) doesNotRecognizeSelector:] + 187 3 CoreFoundation 0x00f3b966 __spedizione + 966 4 CoreFoundation0x00f3b522 _CF_forwarding_prep_0 + 50 5 UIKit 0x0034c340 - [UICalloutView setSubtitle: animato:] + 88 6 UIKit 0x0034c010 - [UICalloutView setSubtitle:] + 49 7 MapKit 0x000bb0ac - [MKAnnotationContainerView _showBubbleForAnnotationView: bounce: scrollToFit: userInitiated: evitare:] + 537 8 MapKit 0x000bc3ed - [MKAnnotationContainerView _setSelectedAnnotationView: rimbalzo: premuto: scrollToFit: userIniziato: evitare:] + 653 9 MapKit 0x000b54bc - [MKAnnotationContainerView _setSelectedAnnotationView: bounce: premuto: scrollToFit: userInitiated:] + 144 10 MapKit 0x0008cab3 - [MKMapView handleTap:] + 459 11 UIKit 0x004ad4f2 - [UIGestureRecognizer _updateGestureWithEvent:] + 730 12 UIKit 0x004a94fe - [UIGestureRecognizer _delayedUpdateGesture] + 47 13 UIKit 0x004afafc _UIGestureRecognizerUpdateObserver + 584 14 CoreFoundation 0x00fab89b CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 27 15 CoreFoundation0x00f406e7 __CFRunLoopDoObservers + 295 16 CoreFoundation 0x00f091d7 __CFRunLoopRun + 1575 17 CoreFoundation 0x00f08840 CFRunLoopRunSpecific + 208 18 CoreFoundation 0x00f08761 CFRunLoopRunInMode + 97 19 GraphicsServices 0x01f071c4 GSEventRunModal + 217 20 GraphicsServices 0x01f07289 GSEventRun + 115 21 UIKit 0x0022ac93 UIApplicationMain + 1160 22 YogurtStoreLocator 0x00002099 principale + 121 23 YogurtStoreLocator 0x00002015 inizio + 53 ) termina chiamato dopo aver lanciato un'istanza di "NSException" sharedlibrary applica-carica-regole tutto Lingua corrente: auto; attualmente obiettivo-c (Gdb)

risposte:

2 per risposta № 1

Solo ambientazione showsUserLocation a YES non è sufficiente. La visualizzazione della mappa deve recuperare quei dati. Si tratta di un processo asincrono e i dati verranno aggiornati solo dopo un po '. Il delegato viene informato di questo aggiornamento tramite mapView:didUpdateUseLocation: metodo. È necessario implementare quel metodo ed effettuare una chiamata a showPin solo dopo aver visualizzato la posizione dell'utente.