删除 MKAnnotation 后如何更新 UserDefaults?
How do I update UserDefaults after deleting an MKAnnotation?
在我的项目中,当用户在屏幕上按下时,mapView 上会出现一个图钉,该图钉被保存到 UserDefaults 中。在底部函数中,当用户选择一个已经在 mapView 上的图钉时,它会被删除。但是,我不确定如何通过 UserDefaults 确保此 pin 保持删除状态...我将在最后一行代码中使用什么?
@IBAction func addPin(_ sender: UILongPressGestureRecognizer) {
guard sender.state == .ended else { return }
let location = sender.location(in: self.mapView)
let locCoord = self.mapView.convert(location, toCoordinateFrom: self.mapView)
let annotation = MKPointAnnotation()
annotation.coordinate = locCoord
annotation.title = titleTextField.text
self.mapView.addAnnotation(annotation)
//Create a dictionary from the annotation
let newAnnotationDict = [
"lat": locCoord.latitude,
"lng": locCoord.longitude,
"title": annotation.title
] as [String : Any]
//Pull the stored annotations data (if local)
var annotationsArray: [[String:Any]]!
var annotationsData = UserDefaults.standard.data(forKey: "StoredAnnotations")
//If the data is nil, then set the new annotation as the only element in the array
if annotationsData == nil {
annotationsArray = [newAnnotationDict]
} else {
//If it isn't nil, then convert the data into an array of dicts
do {
//Convert this data into an array of dicts
annotationsArray = try JSONSerialization.jsonObject(with: annotationsData!, options: []) as! [[String:Any]]
annotationsArray.append(newAnnotationDict)
} catch {
print(error.localizedDescription)
}
}
do {
//Use JSONSerialization to convert the annotationsArray into Data
let jsonData = try JSONSerialization.data(withJSONObject: annotationsArray, options: .prettyPrinted)
//Store this data in UserDefaults
UserDefaults.standard.set(jsonData, forKey: "StoredAnnotations")
} catch {
print(error.localizedDescription)
}
print("This will become the annotation title: \(titleTextField.text).")
print(annotation.coordinate.latitude, annotation.coordinate.longitude)
}
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
var selectedAnnotation = view.annotation
print("Selected Annotation: \((selectedAnnotation?.coordinate.latitude, selectedAnnotation?.coordinate.longitude))")
self.mapView.removeAnnotation(selectedAnnotation!)
// What do I use for the following line?
UserDefaults.standard.set(, forKey: "StoredAnnotations")
}
最快的解决方案是:
从地图视图中删除注释后 self.mapView.removeAnnotation(selectedAnnotation!)
通过执行以下操作将剩余 mapView.annotations 转换为 newAnnotationDict 数组:
let newArray = self.mapView.annotations.map({ ["title": [=10=].title, "lat": [=10=].coordinate.latitude, "lng": [=10=].coordinate.longitude] as [String: Any]})
然后将其序列化为数据并覆盖(而不是附加)UserDefaults 值,就像您在代码中所做的那样。
在我的项目中,当用户在屏幕上按下时,mapView 上会出现一个图钉,该图钉被保存到 UserDefaults 中。在底部函数中,当用户选择一个已经在 mapView 上的图钉时,它会被删除。但是,我不确定如何通过 UserDefaults 确保此 pin 保持删除状态...我将在最后一行代码中使用什么?
@IBAction func addPin(_ sender: UILongPressGestureRecognizer) {
guard sender.state == .ended else { return }
let location = sender.location(in: self.mapView)
let locCoord = self.mapView.convert(location, toCoordinateFrom: self.mapView)
let annotation = MKPointAnnotation()
annotation.coordinate = locCoord
annotation.title = titleTextField.text
self.mapView.addAnnotation(annotation)
//Create a dictionary from the annotation
let newAnnotationDict = [
"lat": locCoord.latitude,
"lng": locCoord.longitude,
"title": annotation.title
] as [String : Any]
//Pull the stored annotations data (if local)
var annotationsArray: [[String:Any]]!
var annotationsData = UserDefaults.standard.data(forKey: "StoredAnnotations")
//If the data is nil, then set the new annotation as the only element in the array
if annotationsData == nil {
annotationsArray = [newAnnotationDict]
} else {
//If it isn't nil, then convert the data into an array of dicts
do {
//Convert this data into an array of dicts
annotationsArray = try JSONSerialization.jsonObject(with: annotationsData!, options: []) as! [[String:Any]]
annotationsArray.append(newAnnotationDict)
} catch {
print(error.localizedDescription)
}
}
do {
//Use JSONSerialization to convert the annotationsArray into Data
let jsonData = try JSONSerialization.data(withJSONObject: annotationsArray, options: .prettyPrinted)
//Store this data in UserDefaults
UserDefaults.standard.set(jsonData, forKey: "StoredAnnotations")
} catch {
print(error.localizedDescription)
}
print("This will become the annotation title: \(titleTextField.text).")
print(annotation.coordinate.latitude, annotation.coordinate.longitude)
}
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
var selectedAnnotation = view.annotation
print("Selected Annotation: \((selectedAnnotation?.coordinate.latitude, selectedAnnotation?.coordinate.longitude))")
self.mapView.removeAnnotation(selectedAnnotation!)
// What do I use for the following line?
UserDefaults.standard.set(, forKey: "StoredAnnotations")
}
最快的解决方案是:
从地图视图中删除注释后 self.mapView.removeAnnotation(selectedAnnotation!)
通过执行以下操作将剩余 mapView.annotations 转换为 newAnnotationDict 数组:
let newArray = self.mapView.annotations.map({ ["title": [=10=].title, "lat": [=10=].coordinate.latitude, "lng": [=10=].coordinate.longitude] as [String: Any]})
然后将其序列化为数据并覆盖(而不是附加)UserDefaults 值,就像您在代码中所做的那样。