如何使用 swift 读取 Firebase 数据库中的值,然后在地图上进行注释?

Posted

技术标签:

【中文标题】如何使用 swift 读取 Firebase 数据库中的值,然后在地图上进行注释?【英文标题】:How can I read values in my Firebase database using swift and then make annotations on a map? 【发布时间】:2017-02-23 12:29:24 【问题描述】:

我是 swift 和 Xcode 的初学者,我的代码需要一些帮助。我制作了一个firebase数据库:

我已经改变了规则:

我有一个地图视图,并且已经对地图上的每个注释进行了编码,只需要有人告诉我如何读取数据库中的所有位置,然后将它们作为注释放在地图视图上。到目前为止,这是我所有的代码:

import UIKit
import MapKit
import FirebaseDatabase

class MapViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate 

    @IBOutlet weak var map: MKMapView!

    override func viewDidLoad() 
        super.viewDidLoad()

        map.showsUserLocation = true
        // Do any additional setup after loading the view.
        map.mapType = .satellite
        self.map.isZoomEnabled = false

        map.showsCompass = false

        map.isRotateEnabled = false
        let latitude: CLLocationDegrees = 51.743370
        let longitude: CLLocationDegrees = -2.279179

        let lanDelta: CLLocationDegrees = 0.05
        let lonDelta: CLLocationDegrees = 0.05
        let span = MKCoordinateSpan(latitudeDelta: lanDelta, longitudeDelta: lonDelta)
        let coordinates = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
        let region = MKCoordinateRegion(center: coordinates, span: span)
        map.setRegion(region, animated: true)
        let annotation = MKPointAnnotation()
        annotation.title = "School House"
        annotation.subtitle = "Main School Building"
        annotation.coordinate = coordinates
        map.addAnnotation(annotation)
        map.selectAnnotation(annotation, animated: true)
        let annotationCollingwood = MKPointAnnotation()
        annotationCollingwood.title = "Collingwood"
        annotationCollingwood.subtitle = "Day House"
        annotationCollingwood.coordinate = CLLocationCoordinate2D(latitude:                                           51.742688, longitude: -2.279362)
        map.addAnnotation(annotationCollingwood)

        let annotationSibly = MKPointAnnotation()
        annotationSibly.title = "Sibly"
        annotationSibly.subtitle = "Musical Theatre"
        annotationSibly.coordinate = CLLocationCoordinate2D(latitude: 51.743518, longitude: -2.279796)
        map.addAnnotation(annotationSibly)

        map.camera.altitude = 300.00
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    @IBAction func menuButton(_ sender: Any) 
        let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
        let resultViewController = storyBoard.instantiateViewController(withIdentifier: "MenuViewController") as! MenuViewController
        self.present(resultViewController, animated:true, completion:nil)
    

 

【问题讨论】:

你能展示你尝试过的firebase吗? Joe - 决定你想问什么,然后问那个。您是否有关于在 Firebase 中存储数据、检索数据或在地图上进行注释的问题?如果您真正要问的是“您如何使用 Firebase?”然后从 google 和众多可用于解决该问题的教程之一开始 您好,抱歉,我没有说得这么清楚。我已经将数据添加到他们网站上的 firebase 数据库中,所以我对此没有任何问题。我只是不知道如何检索位置及其态度和经度,然后将它们全部显示为地图上的注释。我也在努力做到这一点,所以当您向 firebase 数据库添加新位置时,它会在您下次加载地图时出现。我看了很多教程,但不知道如何在我的中实现代码,所以我只是要求一些示例。 请将问题中的图片替换为您的 Firebase 结构和规则的文本数据。这样我们就不必在答案中重新输入它,它可以搜索并且更短。 【参考方案1】:

在 firebase 中使用以下代码获取位置列表:

@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
[_ref child:@"Locations"]
[_ref  observeEventType:FIRDataEventTypeValue
       withBlock:^(FIRDataSnapshot *snapshot) 
                // Loop over children
                NSEnumerator *children = [snapshot children];
                FIRDataSnapshot *child;
                while (child = [children nextObject]) 
                  // here you can set your annotations
                  MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init]
                  annotation.title = child.key
                  annotation.subtitle = @""
                  annotation.coordinate = CLLocationCoordinate2D (latitude: child.value[@"Latitude"], longitude: child.value[@"Latitude"])
                  [map addAnnotation:annotation]
                
              ];

我不知道 FIRDataSnapshot 类,因此从孩子的键中取地名。但确定位置关键。希望这会有所帮助

【讨论】:

嗨,这个代码是在目标 c 中还是 swift 中,因为它只会给我带来很多错误。非常感谢您的快速回复! 很抱歉造成混淆。我混合了目标C和swift。现在代码完全在目标 c【参考方案2】:
let fileManager = NSFileManager.defaultManager()

do 
    try fileManager.removeItemAtPath("**Folder Name of your project**")

catch let error as NSError 
    print("Ooops! Something went wrong: \(error)")

尝试输入此代码。它应该允许您发送和接收数据。

【讨论】:

以上是关于如何使用 swift 读取 Firebase 数据库中的值,然后在地图上进行注释?的主要内容,如果未能解决你的问题,请参考以下文章

从 Firebase 读取数据并保存到数组中 (Swift)

在 Swift 中从 Firebase 读取现有数据一次

从 Firebase 检索和读取数据作为 NSArray (Swift 3)

从 Firebase 中基本读取并使用结果加载 tableview (Swift)

Firebase 读取和保存数据问题 (Swift)

如何读取 Firebase 子值?