【问题标题】:How do I update UserDefaults after deleting an MKAnnotation?删除 MKAnnotation 后如何更新 UserDefaults?
【发布时间】:2019-10-05 15:45:23
【问题描述】:

在我的项目中,当用户在屏幕上按下时,mapView 上会出现一个 pin,并且 pin 被保存到 UserDefaults。在底部函数中,当用户选择一个已经在 mapView 上的图钉时,它会被删除。但是,我不确定如何确保通过 UserDefaults 删除此图钉...我将在最后一行代码中使用什么?

@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")

}

【问题讨论】:

  • 如果您将 jsonValue 存储在 userdefaults 中,您需要从 jsonValue 中删除该值,然后在 userdefaults 中设置该新值。但就我个人而言,我不会将这些值存储在 UserDefaults 中。但改为设置 CoreData/realm/etc
  • 感谢您的快速回复。我对 Swift 很陌生……你有什么办法可以帮我写出来吗? @valosip

标签: swift mapkit mkmapview userdefaults mapkitannotation


【解决方案1】:

最快的解决方案是: 从地图视图中删除注释后self.mapView.removeAnnotation(selectedAnnotation!)

通过执行以下操作将剩余的 mapView.annotations 转换为 newAnnotationDict 数组:

let newArray = self.mapView.annotations.map({ ["title": $0.title, "lat": $0.coordinate.latitude, "lng": $0.coordinate.longitude] as [String: Any]})

然后将其序列化为数据并覆盖(而不是附加)UserDefaults 值,就像您在代码中所做的那样。

【讨论】:

  • 要做到这一点,我基本上只是复制 addPin 函数,对吧?
  • 只需要将newArray序列化为数据,然后为key设置数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多