2017-09-26 108 views
2

我已经看到了这些问题的变体,但没有回答适用于我如何设置我的代码。我很困惑这个解决方案,并且我很快就完成了这个项目。所以,我要求帮助。使用Firebase数据填充地图

我想要做的是这样的:

从我的火力地堡阵列中,设置这样拉的坐标:FireBase Setup

我的主要饲料是这样的:

// 
 
// FeedVC.swift 
 
// GotToGo 
 
// 
 
// Created by HSI on 9/3/17. 
 
// Copyright © 2017 HSI. All rights reserved. 
 
// 
 

 
import UIKit 
 
import MapKit 
 
import Firebase 
 
import CoreLocation 
 

 
class FeedVC: UIViewController, UITableViewDelegate, UITableViewDataSource, MKMapViewDelegate, CLLocationManagerDelegate { 
 

 
    @IBOutlet weak var tableView: UITableView! 
 
    @IBOutlet weak var mapView: MKMapView! 
 

 

 
    let locationManager = CLLocationManager() 
 
    var centerMapped = false 
 
    var geoFire: GeoFire! 
 

 

 

 
    var posts = [Post]() 
 

 
    override func viewDidLoad() { 
 
     super.viewDidLoad() 
 

 
     mapView.delegate = self 
 
     mapView.userTrackingMode = MKUserTrackingMode.follow 
 

 
     tableView.delegate = self 
 
     tableView.dataSource = self 
 

 
     DataService.ds.REF_VENUE.observe(.value, with: { (snapshot) in 
 

 
      self.posts = [] // THIS IS THE NEW LINE 
 

 
      if let snapshot = snapshot.children.allObjects as? [DataSnapshot] { 
 
       for snap in snapshot { 
 
        if let postDict = snap.value as? Dictionary<String, AnyObject> { 
 
         let key = snap.key 
 
         let post = Post(postKey: key, postData: postDict) 
 
         self.posts.append(post) 
 
        } 
 

 
       if let locationDict = snap.value as? Dictionary<String, AnyObject> { 
 

 
        let lat = locationDict["LATITUDE"] as! CLLocationDegrees 
 
        let long = locationDict["LONGITUDE"] as! CLLocationDegrees 
 
        let center = CLLocationCoordinate2D(latitude: lat, longitude: long) 
 
        _ = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.10, longitudeDelta: 0.10)) 
 

 
        print(lat,long) 
 
        } 
 
       } 
 
      } 
 
      self.tableView.reloadData() 
 
     }) 
 
    } 
 

 
    //Brings up the user on the map after authorization 
 
    override func viewDidAppear(_ animated: Bool) { 
 
     super.viewDidAppear(animated) 
 
     locationAuthStatus() 
 
    } 
 

 

 
    //Checks if app is authorized to get user's location data. 
 
    func locationAuthStatus() { 
 
     if CLLocationManager.authorizationStatus() == .authorizedWhenInUse { 
 

 
      mapView.showsUserLocation = true 
 

 
     } else { 
 
      locationManager.requestWhenInUseAuthorization() 
 
     } 
 

 
    } 
 

 
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 
 
     if status == .authorizedWhenInUse { 
 
      mapView.showsUserLocation = true 
 
     } 
 
    } 
 

 
    func centerMapOnLocation(location: CLLocation) { 
 
     let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, 1000, 1000) 
 

 
     mapView.setRegion(coordinateRegion, animated: true) 
 
    } 
 

 
    func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) { 
 
     if let loc = userLocation.location { 
 
      if !centerMapped { 
 
       centerMapOnLocation(location: loc) 
 
       centerMapped = true 
 
      } 
 

 
     } 
 
    } 
 

 
    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
 

 
     var annotationView: MKAnnotationView? 
 

 
     if annotation.isKind(of: MKUserLocation.self) { 
 
      annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: "User") 
 
      annotationView?.image = UIImage(named: "icon") 
 
     } 
 
     
 
     return annotationView 
 
    } 
 

 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
 
     return posts.count 
 
    } 
 

 

 
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
 

 
     if let cell = tableView.dequeueReusableCell(withIdentifier: "detailCell", for: indexPath) as? PostCell { 
 
     let cellData = posts[indexPath.row] 
 

 
     cell.configureCell(post: cellData) 
 
      return cell 
 
     } else { 
 
      return PostCell() 
 
     } 
 
    } 
 

 

 

 
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
 
     let post = posts[indexPath.row] 
 
     performSegue(withIdentifier: "previewSegue", sender: post) 
 
    } 
 

 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
 

 
     if let destination = segue.destination as? PreviewVC { 
 
      if let update = sender as? Post, let update2 = sender as? Post { 
 
       destination.locationData = update 
 
       destination.addressData = update2 
 
      } 
 

 
     } 
 
    } 
 
}

我的代码运行,我可以得到经纬度和长打印,但是,我不知道如何去将它们添加到地图。我应该再创建一个VC并将数据放在那里?我不知道要改变什么,但是我正在枪口下,需要帮助!

+0

我将如何把它变成定制注释。 MKPointAnnotation不允许自定义注释。我很抱歉没有更具体的 –

回答

4

添加以下代码后print(lat,long)

print(lat,long) 
let annotation = MKPointAnnotation() 
annotation.coordinate = CLLocationCoordinate2DMake(lat, long) 
annotation.title = "Hello!" // if you need title, add this line 
self.mapView.addAnnotation(annotation) 
+0

非常感谢!我终于明白了。 –