Кнопка показывает GMSMarkers, но не скрывает это, Как я могу заставить это сделать оба - PullRequest
0 голосов
/ 27 марта 2019

Я создаю приложение, которое показывает разные места. В настоящее время, когда нажимается кнопка, автомобильные местоположения всплывают на карте, однако я хочу скрыть эти отображаемые маркеры, если эта же кнопка будет нажата снова.

Это функция, которая делает снимок моей базы данных из firebase, затем вставляет GMSMarker в это местоположение.

 func showCarIcon() {

    ref = Database.database().reference()

    ref.child("location").observe(.childAdded) { (snapshot:DataSnapshot) in
        if let dict = snapshot.value as? [String:AnyObject] {
            if dict["Activity"] as! String == "Car" {
            let longitude = dict["Longitude"] as! String
            let lattitude = dict["Lattitude"] as! String
            let title = dict["Title"] as! String
                self.carIconArray.insert(coordinate(carLat: lattitude, carLng: longitude), at: 0)
               let n = self.carIconArray.count
               let heightWidth = self.mapView.frame.height
                for marker in 1...n {
                    let carMarker = GMSMarker()
                    let carIconView = UIImage(named: "carPin")
                    let image = carIconView
                    let location = CLLocationCoordinate2D(latitude: Double(lattitude)!, longitude: Double(longitude)!)
                    carMarker.position = location
                    carMarker.icon = image
                    carMarker.title = title
                    carMarker.icon = self.image(image!, scaledToSize: CGSize(width: heightWidth/6, height: heightWidth/6))
                    func displayIt() {
                        if self.carNumber == "1" {
                            carMarker.map = self.mapView
                        } else {
                            carMarker.map = nil
                        }
                    }

                    displayIt()
                }
            }
        }
    }
}

Так что это функция действия, когда кнопка нажата.

var carNumber = String()

@IBAction func showCar(_ sender: Any) {
    if motorisedVehicleButtonActive {
        motorisedVehicleButton.setImage(UIImage(named: "carO"), for: .normal)
        carNumber = "1"
    } else {
        motorisedVehicleButton.setImage(UIImage(named: "car"), for: .normal)
        carNumber = "0"
    }
    print(carNumber)
    motorisedVehicleButtonActive = !motorisedVehicleButtonActive
    showCarIcon()
}

1 Ответ

1 голос
/ 27 марта 2019

Позвольте мне объяснить, в чем проблема с вашим кодом.

  1. Вы создаете новый маркер каждый раз, когда нажимаете кнопку.Таким образом, новый маркер имеет другой идентификатор объекта, чем более старый.

  2. Когда вы попытаетесь удалить его, он не будет работать только из-за того, что он отличается от маркера, который вы поместили на карту.

  3. Так что вам нужно сохранить маркер в массиве и на время удаления, получить значок из массива и удалить его с карты.

Сначала вам нужносоздать массив GMSMarker, потому что вы должны хранить каждый маркер, который размещен на карте.

Итак, напишите следующую строку кода в верхней части вашего класса.

var arrCarMarkers = [GMSMarker]()

ЗатемПосле этого сохраните каждый маркер в этом массиве, который вы размещаете на карте.

Итак, обновите ваш код следующим образом:

func displayIt() {
    if self.carNumber == "1" {
        carMarker.map = self.mapView
        arrCarMarkers.append(carMarker) // Here is store marker in array
    } else {
        carMarker.map = nil
    }
}

Теперь у вас есть все маркеры, которые размещены на карте.Поэтому, если вы хотите удалить эти маркеры, просто обновите ваш код следующим образом:

@IBAction func showCar(_ sender: Any) {
    if motorisedVehicleButtonActive {
        motorisedVehicleButton.setImage(UIImage(named: "carO"), for: .normal)
        carNumber = "1"
        showCarIcon()
    } else {
        motorisedVehicleButton.setImage(UIImage(named: "car"), for: .normal)
        carNumber = "0"
        self.arrCarMarkers.forEach { $0.map = nil }
    }
    print(carNumber)
    motorisedVehicleButtonActive = !motorisedVehicleButtonActive
}

Выше кода удалит все маркеры с карты.

Надеюсь, это будет работатьдля тебя.

...