2016-12-29 61 views
0

我已經有了這個功能,並且非常接近它的工作原理!我想我有一個轉換問題。我可以將座標轉換爲具有3個屬性lat(Double),long(Double)和time(Date)的實體。這有效,我可以將內容打印到屏幕上,而且看起來不錯。但是當我嘗試提取並在地圖上使用座標時,它不起作用。我認爲這是因爲他們沒有被認爲是真正的座標。有任何想法嗎?CLLocationManager,核心數據和陣列

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
    { 
     //ARRAY for lat/long data 
     var latArr:[Double] = [] 
     var longArr:[Double] = [] 
     var timeArr:[Date] = [] 

     let location = locations[0] 
     let annotation = MKPointAnnotation() 
     let span:MKCoordinateSpan = MKCoordinateSpanMake(0.01, 0.01) 
     let myLocation = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude) 
     //annotation.coordinate = myLocation 
     //annotation.title = "\(location.timestamp)" 
     //self.mapView.addAnnotation(annotation) 
     let region:MKCoordinateRegion = MKCoordinateRegionMake(myLocation, span) 
     self.mapView.setRegion(region, animated: true) 
     self.mapView.showsUserLocation = false //SET THIS 
     latitude.text = "latitude: " + "\(location.coordinate.latitude)" 
     longitude.text = "longitude: " + "\(location.coordinate.longitude)" 
     altitude.text = "altitude: " + "\(location.altitude)" 
     speed.text = "speed: " + "\(location.speed)" 
     timestamp.text = "timestamp: " + "\(location.timestamp)" 

     //START -- Core Data 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate 
     let context = appDelegate.persistentContainer.viewContext 

     let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Data") 
     request.returnsObjectsAsFaults = false 

     let data = NSEntityDescription.insertNewObject(forEntityName: "Data", into: context) 
     //let data = NSNumber(double: self.location?.coordinate.latitude) 

     let dlat = Double("\(location.coordinate.latitude)") 
     let dlong = Double("\(location.coordinate.longitude)") 

     data.setValue(dlat, forKey: "lat") 
     data.setValue(dlong, forKey: "long") 
     data.setValue(location.timestamp, forKey: "time") 
     //END -- Core Data 

     do 
     { 
      try context.save() 
      //print("Saved") 
     } 
     catch 
     { 

     } 

     do 
     { 
      var lat: Double = 0 
      var long: Double = 0 
      let t = NSDate() 
      let results = try context.fetch(request) 

      if results.count > 0 
      { 
       for result in results as! [NSManagedObject] 
       { 
        if let datalat = result.value(forKey: "lat") as? Double 
        { 
         //latArr.append(datalat) 
         let lat = datalat 
         print(lat) 
        } 
        if let datalong = result.value(forKey: "long") as? Double 
        { 
         //longArr.append(datalong) 
         let long = datalong 
         print(long) 
        } 
        if let time = result.value(forKey: "time") as? Date 
        { 
         //timeArr.append(time) 
         let t = time 
         print(t) 
        } 
        let mLocation = CLLocationCoordinate2DMake(lat, long) 
        annotation.coordinate = mLocation 
        annotation.title = "\(t)" 
        self.mapView.addAnnotation(annotation) 
       } 
      } 
     } 
     catch 
     { 

     } 
+0

「它不工作」以什麼特定的方式? –

+0

永遠不會有空的catch {}語句。至少在其中放入一個日誌聲明。錯誤可能會飛,但你現在永遠不會知道他們,不是嗎? –

+0

你確定你正在顯示地圖的正確區域嗎?爲了安全起見,您可以添加mapView.showAnnotation(註釋,動畫:false) –

回答

1

我比你的代碼,我使用在類似的場景功能和合並的任何差異(和做了一些編輯爲簡潔起見,你可以採取或離開)。相關部分如下:

let request = NSFetchRequest<Data>(entityName: "Data") 
let annotations: [MKAnnotation] = [] 

annotation.title = 「\(t)」 

for result in results 
{ 
    if data.lat != nil && data.lon != nil 
    { 
     annotation.coordinate = CLLocationCoordinate2D(latitude: data.lat.doubleValue, longitude: data.lon.doubleValue) 
     annotations.append(annotation) 
    } 
    self.mapView.addAnnotations(annotations) 
    self.mapView.showAnnotations(annotations, animated: false) 
} 

我的代碼工作,但它是雨燕3.0這樣一些差異可能是由於從早期版本的變化,如果你使用2.2.or 2.3。我知道我需要將它從NSNumber(從CoreData)推送到Double,但是我認爲如果這是問題,你會得到一個編譯錯誤 - 不知道爲什麼你不是。正如我的評論中所提到的,如果航點僅僅在可見地圖區域外,則顯示註釋將有所幫助。

除此之外,你的代碼對我來說看起來還不錯 - 讓我知道它是否仍然存在。

+0

謝謝。我得到這個錯誤:類型'NSManagedObject'的值沒有成員'lat'。有任何想法嗎?這個錯誤:類型'MKMapView'的值沒有成員'showAnnotation' – SMPLGRP

+0

我改變了獲取請求以將其綁定到你的數據實體(不是一個理想名稱BTW ...),並意識到showAnnotations必須是複數 - 所以我改變了流程來使用數組,這就是我的流程無論如何。 –

+0

仍掛斷。 data.lat來自哪裏?同樣,非常感謝您的幫助 – SMPLGRP