2015-07-16 5 views
0

Мое приложение в настоящее время имеет три вкладки, вкладку для закрепления местоположения и подробный вид закрепленного местоположения на второй вкладке. Я пытаюсь сохранить местоположение булавки в NSUserdefaults. Я хотел бы, чтобы это место оставалось прикованным к перезагрузке приложения, и поэтому подробное представление все равно отобразит подробный вид закрепленного местоположения. Вот то, что я до сих пор,Сохранение аннотации CLLocation и аннотации

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { 
    // Find location of user 
    var userLocation:CLLocation = locations[0] as! CLLocation 
    var latitude = userLocation.coordinate.latitude 
    var longitude = userLocation.coordinate.longitude 
    var latDelta:CLLocationDegrees = 0.01 
    var longDelta: CLLocationDegrees = 0.01 
    var span: MKCoordinateSpan = MKCoordinateSpanMake(latDelta, longDelta) 
    var location:MKUserLocation = currentLocation; 
    var region: MKCoordinateRegion = MKCoordinateRegionMake(location.coordinate, span) 
    var coordinate:CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude); 
    carInitialLocation = userLocation; 
    let locationData = NSKeyedArchiver.archivedDataWithRootObject(carInitialLocation); 
    NSUserDefaults.standardUserDefaults().setObject(locationData, forKey: "locationData"); 
    carInitialCoordinate = coordinate; 

    self.map.setRegion(region, animated: true); 
} 


override func viewDidLoad() { 

    super.viewDidLoad() 
    if let loadedData = NSUserDefaults.standardUserDefaults().dataForKey("locationData") { 
     if let loadedLocation = NSKeyedUnarchiver.unarchiveObjectWithData(loadedData) as? CLLocation { 
      println(loadedLocation.coordinate.latitude); 
      println(loadedLocation.coordinate.longitude); 
      var annotation = MKPointAnnotation() 
      annotation.coordinate = loadedLocation.coordinate 
      annotation.title = title 
      self.map.addAnnotation(annotation) 

     } 
    } 

    map.addAnnotations(artworks) 
    map.delegate = self; 
    manager.delegate = self; 
    manager.desiredAccuracy = kCLLocationAccuracyBest; 
    manager.requestWhenInUseAuthorization(); 
    manager.startUpdatingLocation(); 
    self.map.showsUserLocation = true; 
    currentLocation = map.userLocation; 
} 

Затем я хочу кнопку pinLocation быть отключена, как только пользователь возлагали место один раз. Я стараюсь делать это как так:

@IBAction func pinLocationButton(sender: AnyObject) { 
    // add location to the array, so it can be retrieved and put it into temporary storage 
    //places.append(["name":title,"lat":"\(newCoordinate.latitude)","lon":"\(newCoordinate.longitude)"]) 
    if let loadedData = NSUserDefaults.standardUserDefaults().dataForKey("locationData") { 
     if let loadedLocation = NSKeyedUnarchiver.unarchiveObjectWithData(loadedData) as? CLLocation { 
      println(loadedLocation.coordinate.latitude); 
      println(loadedLocation.coordinate.longitude); 
      pinLocationButton.enabled = false; 

     } 
    } 


    var location = carInitialLocation 
    var coordinate = carInitialCoordinate 

    CLGeocoder().reverseGeocodeLocation(manager.location, completionHandler: { (placemarks, error) -> Void in 
     var title = "" 
     if (error == nil) { 
      if let p = CLPlacemark(placemark: placemarks?[0] as! CLPlacemark) { 

       var subThoroughfare:String = "" 
       var thoroughfare:String = "" 

       if p.subThoroughfare != nil { 

        subThoroughfare = p.subThoroughfare 
       } 
       if p.thoroughfare != nil { 

        thoroughfare = p.thoroughfare 

       } 
       completeAddress = self.displayLocationInfo(p); 
       title = "\(subThoroughfare) \(thoroughfare)" 
      } 
     } 
        // annotation, i.e pins 

    var annotation = MKPointAnnotation() 
    annotation.coordinate = coordinate 
    annotation.title = title 
    self.map.addAnnotation(annotation) 
     // NSUserDefaults.standardUserDefaults().setObject(places, forKey: "places") 
    }) 
} 

Тогда в моей detailVC попытке обратного геокодирования возлагали местоположение, но недобросовестный к текущему местоположению .. который я не понимаю, почему Вот код :

super.viewDidLoad() 

    addressLabel.font = UIFont(name: addressLabel.font.fontName, size: 18) 
    smallMapView.delegate = self; 
    locationManager.delegate = self; 
    smallMapView.mapType = MKMapType.Hybrid; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    locationManager.requestWhenInUseAuthorization(); 
    locationManager.startUpdatingLocation(); 
    smallMapView.zoomEnabled = true; 
    smallMapView.rotateEnabled = true; 

    if let loadedData = NSUserDefaults.standardUserDefaults().dataForKey("locationData") { 
     if let loadedLocation = NSKeyedUnarchiver.unarchiveObjectWithData(loadedData) as? CLLocation { 
      println(loadedLocation.coordinate.latitude); 
      println(loadedLocation.coordinate.longitude); 

      CLGeocoder().reverseGeocodeLocation(loadedLocation, completionHandler: { (placemarks, error) -> Void in 
       var title = ""; 
       var subtitle = ""; 
       var locality = ""; 
       if(error == nil) { 
        if let placemark = CLPlacemark(placemark: placemarks?[0] as! CLPlacemark) { 
         var subThoroughfare:String = ""; 
         var thoroughfare:String = ""; 
         var locality:String = ""; 
         var postalCode:String = ""; 
         var administrativeArea:String = ""; 
         var country:String = ""; 

         if (placemark.subThoroughfare != nil) { 
          subThoroughfare = placemark.subThoroughfare; 
         } 
         if(placemark.thoroughfare != nil) { 
          thoroughfare = placemark.thoroughfare; 
         } 
         if(placemark.locality != nil) { 
          locality = placemark.locality; 
         } 
         if(placemark.postalCode != nil) { 
          postalCode = placemark.postalCode; 
         } 
         if(placemark.administrativeArea != nil) { 
          administrativeArea = placemark.administrativeArea; 
         } 
         if(placemark.country != nil) { 
          country = placemark.country; 
         } 
         println("viewcontroller placmark data:"); 
         println(locality); 
         println(postalCode); 
         println(administrativeArea); 
         println(country); 

         title = " \(subThoroughfare) \(thoroughfare) \n \(locality), \(administrativeArea) \n \(postalCode) \(country)"; 
         subtitle = " \(subThoroughfare) \(thoroughfare)"; 
         println(title); 
         self.addressLabel.text = title; 
        } 
       } 
       var latitude = loadedLocation.coordinate.latitude; 
       var longitude = loadedLocation.coordinate.longitude; 
       var latDelta:CLLocationDegrees = 0.001; 
       var longDelta:CLLocationDegrees = 0.001; 

       var span: MKCoordinateSpan = MKCoordinateSpanMake(latDelta, longDelta); 
       var overallLoc = CLLocationCoordinate2DMake(latitude, longitude); 
       var region:MKCoordinateRegion = MKCoordinateRegionMake(overallLoc, span); 
       var annotation = MKPointAnnotation(); 
       annotation.coordinate = loadedLocation.coordinate; 
       annotation.title = subtitle; 
       self.smallMapView.addAnnotation(annotation); 
       self.smallMapView.setRegion(region, animated: true) 

      }) 

     } 
    } 


} 

ответ

1

в функции pinLocationButton, вы используете manager.location, что неправильно, вы должны использовать

CLGeocoder().reverseGeocodeLocation(location, completionHandler: { (placemarks, error) -> Void in 
    var title = "" 
    if (error == nil) { 
    // .... 
+0

это должно работать! :) – Jaimy

Смежные вопросы