2012-03-29 22 views
7

Próbuję pokazać bieżące położenie użytkownika, ustawiając właściwość MKMapView, tj. setShowsUserLocation na YES. Domyślnie strzałka pojawia się w lewym górnym rogu ekranu iPhone'a, gdy aplikacja zaczyna aktualizować lokalizację użytkownika. Jednak po wyświetleniu bieżącej lokalizacji strzałka powinna zniknąć, ale nadal jest obecna tak długo, jak aplikacja jest uruchomiona, co oznaczałoby, że aplikacja jest nadal aktualizowanie lokalizacji w tle? więc jak mogę zatrzymać aktualizację bieżącej lokalizacji? I wprowadziły delegata, który zostaje powołany natychmiast ..Pokaż aktualną lokalizację użytkownika za pomocą MKMapView?

Odpowiedz

15

Jeśli mapa jest widoczna i parametr showUserLocation jest ustawiony na wartość YES, będzie on nadal aktualizowany w tle.

Należy usunąć to ustawienie, gdy widok zniknie lub gdy aplikacja przejdzie do tła. Najlepszym sposobem byłoby prawdopodobnie zarejestrowanie swojego kontrolera viewController w celu otrzymania powiadomienia o numerach UIApplicationDidEnterBackgroundNotification i UIApplicationDidBecomeActiveNotification.

- (void)viewDidLoad{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appToBackground) name:UIApplicationDidEnterBackgroundNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appReturnsActive) name:UIApplicationDidBecomeActiveNotification object:nil]; 
} 

Następnie w metodzie zwanej przez tego powiadomienia, zmienić właściwości mapa dotyczące userLocation:

- (void)appToBackground{ 
    [mapview setShowsUserLocation:NO]; 
} 

And

- (void)appReturnsActive{ 
    [mapview setShowsUserLocation:YES]; 
} 

Sprawdź, czy te metody są rzeczywiście zwany przez ustawienie punktu przerwania tam i powracając do ekranu głównego.

+2

Używam tej metody, ale dostaję co zdaje się być zawieszeniem stanu wyścigu podczas wchodzenia w tło: '[MKMapView (UserPositioning) stopUpdatingUserLocation]' wywołuje '[MKMapView (UserPositioningInternal) removeUserLocation]' który wysadza się z SIGSEGV. Nie sądzisz, że już to widziałeś/rozwiązałeś? –

+0

trzeba usunąć obserwatora, gdy 'viewDidUnload'? – Raptor

+1

@MichaelKernahan Dostaję ten sam problem. Czy kiedykolwiek znalazłeś rozwiązanie? – horsejockey

0

można zatrzymać aktualizację lokalizację wysyłając wiadomość do lokalizacji menedżer [self.locationManager stopUpdatingLocation];

W Twoim przypadku, nie próbować zatrzymać pokazując lokalizację użytkowników?

+0

Nie używam żadnego menedżera lokalizacji. Jeśli to zatrzymam, ukrywa on również adnotację (lokalizację). – hemant

+0

Spróbuj wprowadzić 'CLLocationManagerDelegate', będziesz mieć lepszy sposób kontrolowania CoreLocation Framework. Możesz znaleźć dobry tutorial początkowy tutaj: http://www.switchonthecode.com/tutorials/getting-your-location-in-an-iphone-application –

1

Zgadzam się z Michaelem Kernahanem, jestem prawie pewien, że w wyścigu jest MKMapView.

MKMapView wydaje się próbować usunąć samodzielnie userLocationAnnotation (niebieską kropkę), gdy tylko zorientuje się, że stracił dostęp do usług lokalizacyjnych.

jednak, że nie wydaje się być chronione i jeśli deweloper wystawia również [mapView setShowsUserLocation:NO], to jest bardzo prawdopodobne, aby uzyskać awarii z powodu wyścigu między gwintem wewnętrznym MKMapView „s próbuje usunąć userLocationAnnotation i wątek, który dzwoni setShowsUserLocation:NO.

+0

Uzgodnione. Wydaje się, że jest to szczególnie problem w iOS 7.x. Nie sądzę, że widziałem go już 8.x. – Kevin

Powiązane problemy