2014-12-01 10 views
11

जब आप इंटरफ़ेस बिल्डर में दृश्य में एक MKMapView घटक जोड़ने, वहाँ चेक बॉक्स आप कॉन्फ़िगर यह क्या दर्शाता है की अनुमति देते हैं:आईओएस 8 में एमकेमैप व्यू के "उपयोगकर्ता स्थान दिखाता है" का उपयोग कैसे करें?

enter image description here

जब आप जाँच "उपयोगकर्ता स्थान", यह स्वतः पर उपयोगकर्ता के स्थान से पता चलता नक्शा।

हालांकि, आईओएस 8 के बाद से आप उपयोगकर्ता के स्थान को दिखाने से पहले स्थान अनुमति मांगना चाहते हैं। यदि आप नहीं करते हैं, तो आपको कंसोल में चेतावनी देने के बिना "नक्शाकिट स्थान अपडेट शुरू करने का प्रयास करना" मिलता है।

तो मैं plist करने के लिए एक NSLocationWhenInUseUsageDescription कुंजी जोड़ दिया है, और viewDidLoad लिए इस कोड को कहा:

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

यह हालांकि काम करने के लिए प्रतीत नहीं होता। मुझे अनुमति के लिए पूछने वाला एक पॉपअप मिलता है, लेकिन इससे पहले कि मैं कोई जवाब चुनूं, यह स्वयं ही छुपाता है, नक्शा इसके नीचे लोड होता है और मुझे कंसोल में चेतावनी मिलती है।

मुझे पता है कि मैं अनुमति प्राप्त करने के बाद कोड में showsUserLocation संपत्ति सेट कर सकता हूं; लेकिन मेरा मुद्दा यह है कि आईबी में यह चेकबॉक्स है जो एक ही काम करना है, सिवाय इसके कि यह तुरंत ट्रैकिंग शुरू कर देता है। क्या इसका मतलब यह है कि हमें आईओएस 8 के बाद से इस चेकबॉक्स का उपयोग नहीं करना चाहिए? या क्या मैं इसे गलत तरीके से उपयोग कर रहा हूं?

-

अद्यतन: वास्तव में, अपने आप में पॉपअप खाल परवाह किए बिना अगर "उपयोगकर्ता स्थान से पता चलता है" या सेट नहीं है। मैंने इसे viewWillAppear या viewDidAppear में करने की कोशिश की है, लेकिन इससे मदद नहीं मिली। तो मुझे यकीन है कि जहां वास्तव में मैं जब एक MKMapView का उपयोग कर requestwhenInUseAuthorization फोन करना चाहिए नहीं कर रहा हूँ ...

उत्तर

9

विधि 0 निष्पादन पूर्ण होने के बाद आपके CLLocationManager उदाहरण एआरसी द्वारा जारी किया गया है। जैसे ही इंस्टेंस जारी किया गया, संवाद गायब हो गया। समाधान बल्कि सरल था। एक विधि-स्तर चर जा रहा है एक वर्ग स्तर के उदाहरण चर होने के लिए से CLLocationManager उदाहरण परिवर्तित करें, और यह मजबूत - इस ObjC :)

स्विफ्ट के लिए के लिए है ... ऐसा ही कुछ कार्य करें:

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() 
      } 
    ... 
    } 

तो ... CLLocationManager().requestWhenInUseAuthorization() उपयोग नहीं करते - बजाय locationManager.requestWhenInUseAuthorization() का उपयोग करें - locationManager घोषित जल्दी

+0

आह, आप सही हैं, एआरसी मुझे स्मृति प्रबंधन के बारे में पूरी तरह से भूल जाता है और कभी-कभी इस तरह की चीजों की ओर जाता है। ऐसा लगता है कि अगर मैं प्रबंधक को बरकरार नहीं रखता तो यह पॉप अप भी नहीं दिखाता है। यदि मैं करता हूं, तो यह काम करता है, धन्यवाद। –

+0

आपकी मदद करने में खुशी हुई! :) – TonyMkenu

+0

अच्छा मुझे लगता है कि प्रतिनिधि का संदर्भ उदाहरण के आसपास रखने के लिए पर्याप्त नहीं है। एक बार फिर धन्यवाद! – Quincy

0

requestWhenInUseAuthorization अतुल्यकालिक है - सुनिश्चित करें कि आप वास्तव में ट्रैक या दिखाने की कोशिश कर रहा से पहले अपने मानचित्र दृश्य प्रतिनिधि में प्राधिकरण परिवर्तन स्थिति को सुन रहे हैं उपयोगकर्ता का स्थान

+3

लेकिन यहाँ बात है, मैं कोड में उपयोगकर्ता के स्थान को ट्रैक करना शुरू नहीं कर रहा हूँ। यदि मैं आईबी में "शो: उपयोगकर्ता स्थान" की जांच करता हूं, तो एनआईबी लोडर इसे करता है, और यह प्रतिनिधि/नियंत्रक में जो कुछ भी कर रहा है उसके साथ स्वचालित रूप से और असीमित रूप से शुरू होता है। तो मैं जो पूछ रहा हूं, क्या आईओएस 8 में इस चेकबॉक्स का उपयोग करके इसे ठीक से करने का कोई तरीका है? –

संबंधित मुद्दे