使用Firebase数据填充地图

时间:2017-09-26 02:41:18

标签: ios swift firebase firebase-realtime-database mapkit

我已经看到了这些问题的变体,但是没有适用于我如何设置代码的答案。我对解决方案感到困惑,并且我已经立即完成了这个项目。所以,我正在寻求帮助。

我想做的是:

从我的Firebase阵列中拉出坐标,设置如下:FireBase Setup

我的主要Feed是这样的:



//
//  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
            }

        }
    }
}
&#13;
&#13;
&#13;

我的代码运行,我可以打印Lat和Long,但我不知道如何将它们添加到地图中。我应该制作另一个VC并将数据放入那里吗?我不知道该改变什么,但是,我还需要帮助!

1 个答案:

答案 0 :(得分:4)

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)

之后添加以下代码
class ViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    let detailVC = DetailVC()
    let animationController = AnimationController()

    override func viewDidLoad() {
        super.viewDidLoad()
        collectionView?.delegate = self
        collectionView?.dataSource = self

        detailVC.transitioningDelegate = self

        collectionView?.register(ControllerCell.self, forCellWithReuseIdentifier: "klk")
        collectionView?.isPagingEnabled = false
        collectionView?.contentInset = UIEdgeInsets(top: 0, left: 80, bottom: 0, right: 10)
        let layout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout
        layout?.scrollDirection = .horizontal

    }

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 5
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "klk", for: indexPath) as! ControllerCell
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: view.frame.width * 0.6, height: view.frame.height * 0.5)
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 100
    }


    override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath)
        animationController.originFrame = cell?.frame
        present(DetailVC(), animated: true, completion: nil)
    }

}

extension ViewController: UIViewControllerTransitioningDelegate {

    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return animationController
    }
}