2015-06-19 14 views
9

में तत्काल स्थान अनुमतियों को संभालने में मैं एक मूल मानचित्र दृश्य को लागू करने की कोशिश कर रहा हूं और एक उपयोगकर्ता के वर्तमान स्थान को एनोटेशन के रूप में मानचित्र में जोड़ रहा हूं। मैंने अपनी जानकारी के अनुरोध के लिए अनुरोध जोड़ा है। प्लिस्ट और आयातित कोरलोकेशन।त्वरित

locManager.requestWhenInUseAuthorization() 
var currentLocation : CLLocation 

if(CLLocationManager.authorizationStatus() == CLAuthorizationStatus.AuthorizedWhenInUse){ 

    currentLocation = locManager.location 
    println("currentLocation is \(currentLocation)")  
} 
else{ 
    println("not getting location") 
    // a default pin 
} 

मैं शीघ्र फिर से हो रही है:

मेरे विचार नियंत्रक का किया लोड विधि में, मैं निम्नलिखित है। स्थान पुनर्प्राप्त करने की अनुमति। जैसा कि यह हो रहा है, मुझे अपना प्रिंट कह रहा है कि स्थान नहीं मिल रहा है, जाहिर है क्योंकि उपयोगकर्ता को ठीक टैप करने का मौका मिलने से पहले यह चलता है। यदि मैं ऐप को एलेव करता हूं और वापस आ जाता हूं तो मैं स्थान पुनर्प्राप्त कर सकता हूं और इसे मानचित्र में जोड़ सकता हूं। हालांकि, मैं चाहता हूं कि जब उपयोगकर्ता वर्तमान स्थान को पकड़ने में सक्षम हो और उसे वहां और फिर मानचित्र में जोड़ने के लिए पहली बार ठीक हो जाए। इसे कैसे प्राप्त किया जा सकता है? मैं एक पिन जोड़ने के लिए निम्न विधि है:

func addPin(location2D: CLLocationCoordinate2D){ 
    self.mapView.delegate = self 
    var newPoint = MKPointAnnotation() 
    newPoint.coordinate = location2D 
    self.mapView.addAnnotation(newPoint) 
} 

उत्तर

22

ऐसा करने में, आप अपने स्थान प्रबंधक प्रतिनिधि जो शीघ्र ही कहा जाता है के बाद CLLocationManager आरंभ नहीं हो जाता के लिए विधि didChangeAuthorizationStatus को लागू करने की जरूरत है।

पहले, फ़ाइल के शीर्ष पर जोड़ना भूल नहीं है: import CoreLocation

कि ऐसा करने के लिए, अपनी कक्षा में जहां स्थान का उपयोग कर रहे, प्रतिनिधि प्रोटोकॉल जोड़ें। तब viewDidLoad विधि में (या applicationDidFinishLaunching अगर आप AppDelegate में हैं) आपके स्थान प्रबंधक को प्रारंभ और सेट अपने delegate संपत्ति self रहे हैं:

class myCoolClass: CLLocationManagerDelegate { 
    var locManager: CLLocationManager! 

    override func viewDidLoad() { 
     locManager = CLLocationManager() 
     locManager.delegate = self 
    } 
} 

अंत में, locationManager (_ didChangeAuthorizationStatus _) के शरीर में विधि को लागू अपने जिस वर्ग को आपने पहले घोषित किया था, इस विधि को तब कहा जाएगा जब प्राधिकरण की स्थिति बदल दी जाती है, जैसे ही आपका उपयोगकर्ता बटन क्लिक करता है। आप इसे इस तरह लागू कर सकते हैं:

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
    switch status { 
    case .NotDetermined: 
     // If status has not yet been determied, ask for authorization 
     manager.requestWhenInUseAuthorization() 
     break 
    case .AuthorizedWhenInUse: 
     // If authorized when in use 
     manager.startUpdatingLocation() 
     break 
    case .AuthorizedAlways: 
     // If always authorized 
     manager.startUpdatingLocation() 
     break 
    case .Restricted: 
     // If restricted by e.g. parental controls. User can't enable Location Services 
     break 
    case .Denied: 
     // If user denied your app access to Location Services, but can grant access from Settings.app 
     break 
    default: 
     break 
    } 
} 

स्विफ्ट 4 - नई enum वाक्य रचना

स्विफ्ट 4 के लिए, बस प्रत्येक enum मामले के पहले अक्षर (.notDetermined, .authorizedWhenInUse, .authorizedAlways लोअरकेस करने के लिए स्विच , .restricted और .denied)

इस तरह आप प्रत्येक मामले को संभाल सकते हैं, उपयोगकर्ता ने गीलेर को इसकी अनुमति दी है या इसे रद्द कर दिया है।

+0

प्रतिक्रिया के लिए धन्यवाद। लाइन locManger.delegate = स्वयं मुझे एक त्रुटि 'अपेक्षित घोषणा' दे रहा है – user2363025

+0

@ user2363025 क्या आप विस्तृत कर सकते हैं? त्रुटि पर क्लिक करें और आपको और अधिक –

+0

बताएं कि यह सभी त्रुटि कहती है। होवर पर कोई अतिरिक्त जानकारी पॉप अप नहीं हो रही है। मैंने यहां देखा है http://stackoverflow.com/questions/24121761/how-to-use-corelocation-with-swift कि शायद मुझे appMlegager में locManager को परिभाषित करना है? मुझे स्विच स्टेटमेंट के हर मामले में त्रुटियां भी मिल रही हैं, जिसमें कहा गया है कि प्रत्येक विधियों को कोई तर्क नहीं कहा जा सकता है कि मैंने ऐपडिलेगेट में locManager को परिभाषित किया है या मेरे व्यू कंट्रोलर – user2363025

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