2014-12-01 26 views
11

Po dodaniu komponentu MKMapView do widoku w konstruktorze Interface, istnieją pola wyboru, które pozwalają skonfigurować co pokazuje:Jak korzystać z "Pokaż lokalizację użytkownika" MKMapView w iOS8?

enter image description here

Podczas sprawdzania „User Location”, automatycznie pokazuje lokalizację użytkownika na mapa.

Jednak od czasu instalacji systemu iOS 8 należy poprosić o pozwolenie na lokalizację przed wyświetleniem lokalizacji użytkownika. Jeśli tego nie zrobisz, pojawi się komunikat "Próba uruchomienia aktualizacji lokalizacji MapKit bez monitowania" w konsoli.

Więc dodałem NSLocationWhenInUseUsageDescription klucz do plist, i dodaje ten kod do viewDidLoad:

if CLLocationManager.authorizationStatus() == .NotDetermined { 
    CLLocationManager().requestWhenInUseAuthorization() 
} 

nie wydają się działać chociaż. Dostaję wyskakujące okienko z prośbą o pozwolenie, ale zanim wybieram odpowiedź, sama się ukrywa, mapa ładuje się pod nią i otrzymuję ostrzeżenie w konsoli.

Wiem, że mogę ustawić właściwość showsUserLocation w kodzie zamiast tego, tylko po uzyskaniu pozwolenia; ale chodzi mi o to, że jest to pole wyboru w IB, które powinno robić to samo, z wyjątkiem, że natychmiast rozpoczyna śledzenie. Czy to oznacza, że ​​nie powinniśmy używać tego pola wyboru od czasu iOS 8? Czy używam go niepoprawnie?

-

Aktualizacja: faktycznie, Skóry popup przez siebie niezależnie czy „pokazuje lokalizację użytkownika” jest ustawiona czy nie. Próbowałem zrobić to w viewWillAppear lub viewDidAppear, ale to nie pomogło. Więc nie jestem pewien, gdzie dokładnie mam zadzwonić requestwhenInUseAuthorization podczas używania MKMapView ...

Odpowiedz

9

Twoja instancja CLLocationManager jest zwalniana przez ARC po wykonaniu metody zakończonej. Zaraz po zwolnieniu instancji okno zniknęło. Rozwiązanie było raczej proste. Zmień instancję CLLocationManager od bycia zmienną metoda szczebla być zmienną instancji klasy poziomu, a potem to Strong - to jest dla ObjC :)

do szybkiego ... zrobić coś takiego:

class YourViewController: UIViewController,CLLocationManagerDelegate { 
    ... 
    let locationManager = CLLocationManager() 


    override func viewDidLoad() { 
      super.viewDidLoad() 
      // Ask for permission for location 
      locationManager.delegate = self 

      if(locationManager.respondsToSelector("requestAlwaysAuthorization")) { 
       locationManager.requestAlwaysAuthorization() 
       //or 
       //locationManager.requestWhenInUseAuthorization() 
      } 
    ... 
    } 

... więc nie używać CLLocationManager().requestWhenInUseAuthorization() - zamiast używać locationManager.requestWhenInUseAuthorization() - locationManager ogłosił wczesne

+0

Ach, masz rację, ARC pozwala mi całkowicie zapomnieć o zarządzaniu pamięcią i czasami prowadzi do takich rzeczy. Wygląda na to, że w ogóle nie wyświetla się pop-up, jeśli nie zatrzymam menedżera. Jeśli tak, to działa tak, jak powinno, dzięki. –

+0

Cieszę się, że mogę Ci pomóc! :) – TonyMkenu

+0

Miło Myślę, że odniesienie do delegata nie wystarczy, aby utrzymać instancję wokół. Dzięki jeszcze raz! – Quincy

0

requestWhenInUseAuthorization jest asynchroniczna - upewnij się, że słuchanie statusu zmiany zezwolenia w swoim widoku mapy delegata zanim rzeczywiście próbuje śledzić lub pokaz lokalizacja użytkownika.

+3

Ale chodzi o to, że nie zaczynam śledzić lokalizację użytkownika w kodzie. Jeśli zaznaczę "Pokaż: położenie użytkownika" w IB, to program ładujący NIB zrobi to i uruchomi go automatycznie i asynchronicznie z tym, co robię w delegacie/kontrolerze. Pytam więc, czy istnieje sposób, aby zrobić to poprawnie, używając tego pola wyboru w iOS 8? –