2016-12-29 65 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