如何使用 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)
从 Firebase 检索和读取数据作为 NSArray (Swift 3)