Удаление пина из mapView, созданного с использованием CoreData - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть вид карты с пользовательскими аннотациями. Аннотации загружаются из coreData. Я хотел бы, чтобы пользователь мог нажимать на аннотацию, чтобы редактировать или удалять контакты. Я действительно изо всех сил пытаюсь удалить только выбранную аннотацию. Я новичок в программировании и еще новее в Core Data, поэтому прошу прощения за любое невежество. Вот функция, которую я пытаюсь заставить работать. С помощью этой функции ничего не удаляется и не печатается.

func  deletePin() {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext
    let requestDel = NSFetchRequest<NSFetchRequestResult>(entityName: "Fish")

    let thisCatch = selectedAnnotation?.title
    requestDel.returnsObjectsAsFaults = false

    let predicateDel = NSPredicate(format: "species == %d", thisCatch!)
    requestDel.predicate = predicateDel


    do {
        let locations = try context.fetch(requestDel)
        for location in locations{
            context.delete(location as! NSManagedObject)

            self.map.removeAnnotation(selectedAnnotation!)
            print("pinDeleted")
        }
    } catch {
        print("Failed")
    }

    do {
        try context.save()
    } catch {
        print("Failed saving")
    }
}

Вот расширение, где я пытаюсь вызвать deletePin ()

extension MapViewController: ExampleCalloutViewDelegate {
func mapView(_ mapView: MKMapView, didTapDetailsButton button: UIButton, for annotation: MKAnnotation) {



    let alert = UIAlertController(title: "Edit or Delete", message: "Any changes are permenate!", preferredStyle: .alert)
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)

    let deleteDataAction = UIAlertAction(title: "delete", style: .destructive, handler: { action in

        self.deletePin()

       // self.map.removeAnnotation(annotation)
      //  print(annotation.title!)

1 Ответ

0 голосов
/ 05 сентября 2018

Я получил его на работу, используя этот код все в расширении.

extension MapViewController: ExampleCalloutViewDelegate {
func mapView(_ mapView: MKMapView, didTapDetailsButton button: UIButton, for annotation: MKAnnotation) {



    let alert = UIAlertController(title: "Edit or Delete", message: "Any changes are permenate!", preferredStyle: .alert)
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)

    let deleteDataAction = UIAlertAction(title: "delete", style: .destructive, handler: { action in

        let pinTitle = self.selectedAnnotation?.title

            do{
                let request: NSFetchRequest<Fish> = Fish.fetchRequest()
                let predicate = NSPredicate(format: "species == %@", pinTitle!)
                request.predicate = predicate

                let locations = try self.context.fetch(request)
                for location in locations{
                    self.context.delete(location)

                    self.map.removeAnnotation(self.selectedAnnotation!)
                    print("pinDeleted")
                }
            } catch {
                print("Failed")
        }

        do {
            try self.context.save()
        } catch {
            print("Failed saving")
        }

    })

Для моего использования selectedAnnotation.title - это время и дата, поэтому это уникальный идентификатор. Если у кого-то есть более понятный способ настройки, пожалуйста, дайте мне знать!

...