使用来自 Firebase 的数据在地图上显示注释图像的奇怪行为.斯威夫特 4.1



奇怪的行为是,当我添加新的注释时,无论是点击还是用户位置,它都会以正确选择的图标显示。 当 MapVC 首次加载时,从 Firebase 检索到的帖子都具有相同的图标(最新发布的帖子的图标名称。如果在发布一个新图标后,我将 mapViewVc 退出菜单 VC 并重新输入 mapViewVC,那么每个图标都会再次显示相同的图标,现在是我之前发布的图标。 有几次,图标是两个不同的图标,随机选择。 我不明白为什么坐标正确,但图像不正确。

应用流为: 我有一个mapView vc,我可以在其中双击屏幕并通过按钮获取坐标或编码用户位置坐标,然后进入chooseIconVic,在那里我有所有可用的图标可供选择用于注释。一旦我选择一个,图标名称就会在 unwindHere(( 的 mapViewVC 中传递回,它将图标名称存储到一个变量中并协调到另一个变量中。在postAlertNotification中,这些变量会发布到Firebase。 在displayAlerts((中,来自Firebase的数据被存储到变量中以初始化注释并添加到mapView中。

所选图标:

@IBAction func unwindHere(sender:UIStoryboardSegue) { // data coming back
if let sourceViewController = sender.source as? IconsViewController {
alertNotificationType = sourceViewController.dataPassed
if tapCounter > 0  {
alertNotificationLatitude = String(describing: alertCoordinates.latitude)
alertNotificationLongitude = String(describing: alertCoordinates.longitude)
postAlertNotification()      // post new notification to Firebase
} else {
alertCoordinates = self.trackingCoordinates
alertNotificationLatitude = String(describing: self.trackingCoordinates!.latitude)
alertNotificationLongitude = String(describing: self.trackingCoordinates!.longitude)
postAlertNotification()   // post new notification to Firebase
}
}
}

比帖子:

func postAlertNotification() {
// to set next notification id as the position it will have in array ( because first position is 0 ) we use the array.count as value

let latitude = alertNotificationLatitude
let longitude = alertNotificationLongitude
let alertType = alertNotificationType
let post: [String:String] = [//"Date" : date as! String,
//"Time" : time as! String,
"Latitude" : latitude as! String,
"Longitude" : longitude as! String,
"Description" : alertType as! String]
var ref: DatabaseReference!
ref = Database.database().reference()
ref.child("Community").child("Alert Notifications").childByAutoId().setValue(post)
}

检索并显示:

func displayAlerts() {

ref = Database.database().reference()

databaseHandle = ref?.child("Community").child("Alert Notifications").observe(.childAdded, with: { (snapshot) in
//            defer { self.dummyFunctionToFoolFirebaseObservers() }
guard let data = snapshot.value as? [String:String] else { return }
guard let firebaseKey = snapshot.key as? String else { return }
//                let date = data!["Date"]
//                let time = data!["Time"]
let dataLatitude = data["Latitude"]!
let dataLongitude = data["Longitude"]!
self.alertIconToDisplay = data["Description"]!
let doubledLatitude = Double(dataLatitude)
let doubledLongitude = Double(dataLongitude)
let recombinedCoordinate = CLLocationCoordinate2D(latitude: doubledLatitude!, longitude: doubledLongitude!)
print("Firebase post retrieved !")
print("Longitude Actual DataKey is (String(describing: firebaseKey))")
print("fir long ((snapshot.value!, snapshot.key))")
self.userAlertAnnotation = UserAlert(type: self.alertIconToDisplay!, coordinate: recombinedCoordinate, firebaseKey: firebaseKey)
self.mapView.addAnnotation(self.userAlertAnnotation)

})
}

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
let annotationView = MKAnnotationView(annotation: userAlertAnnotation, reuseIdentifier: "")    //  CHANGE FOR NEW ANNOTATION : FULL DATA
//added if statement for displaying user location blue dot
if annotation is MKUserLocation{
return nil
} else {

annotationView.image = UIImage(named: alertIconToDisplay!)                        //    choose the image to load
let transform = CGAffineTransform(scaleX: 0.27, y: 0.27)
annotationView.transform = transform
return annotationView
}
}

变量声明:

var alertIconToDisplay: String?
var userAlertAnnotation: UserAlert!  
var alertNotificationType: String?                                             
var alertNotificationLatitude: String? 
var alertNotificationLongitude: String?  

更新:

注释 cLass:

import MapKit

class UserAlert: NSObject , MKAnnotation {
var type: String?
var firebaseKey: String?
var coordinate = CLLocationCoordinate2D()
var image: UIImage?
override init() {
}
init(type:String, coordinate:CLLocationCoordinate2D, firebaseKey: String) {
self.type = type
self.firebaseKey = firebaseKey
self.coordinate = coordinate
}
}

在了解问题所在后,我解释了如何将 displayAlert(( 更改为

func displayAlerts() { // rajish version
ref = Database.database().reference()
databaseHandle = ref?.child("Community").child("Alert Notifications").observe(.childAdded, with: { (snapshot) in
//            defer { self.dummyFunctionToFoolFirebaseObservers() }
guard let data = snapshot.value as? [String:String] else { return }
guard let firebaseKey = snapshot.key as? String else { return }
//                let date = data!["Date"]
//                let time = data!["Time"]
let dataLatitude = data["Latitude"]!
let dataLongitude = data["Longitude"]!
let type = data["Description"]!
let id = Int(data["Id"]!)
let doubledLatitude = Double(dataLatitude)
let doubledLongitude = Double(dataLongitude)
let recombinedCoordinate = CLLocationCoordinate2D(latitude: doubledLatitude!, longitude: doubledLongitude!)
print("Firebase post retrieved !")
print("Longitude Actual DataKey is (String(describing: firebaseKey))")
print("fir long ((snapshot.value!, snapshot.key))")
var userAlertAnnotation = UserAlert(type: type, coordinate: recombinedCoordinate, firebaseKey: firebaseKey, title: type,id: id!)
self.userAlertNotificationArray.append(userAlertAnnotation)  // array of notifications coming from Firebase
print("user alert array after append from Firebase is : (self.userAlertNotificationArray)")
self.alertNotificationArray.append(recombinedCoordinate) // array for checkig alerts on route
self.mapView.addAnnotation(userAlertAnnotation)
})
}

和地图视图到:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation( -> MKAnnotationView?{//拉吉什版本

let annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: "")

if annotation is MKUserLocation{
return nil
} else {
print(annotation.coordinate)
annotationView.image = UIImage(named:(annotationView.annotation?.title)! ?? "")
//            annotationView.canShowCallout = true
let transform = CGAffineTransform(scaleX: 0.27, y: 0.27)
annotationView.transform = transform
return annotationView
}
}

这就解决了。

最新更新