按钮显示 GMSMarkers 但没有隐藏它,如何让它同时执行这两项操作

Button is Showing GMSMarkers but isn't Hiding it, How do I get it to do both

我正在创建一个显示不同位置的应用程序。目前,当按下一个按钮时,汽车位置会在地图上弹出,但是如果再次按下同一个按钮,我想隐藏那些显示的标记。

这是从 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. 每次按下按钮时,您都在创建新标记。因此,新标记与旧标记具有不同的对象 ID。

  2. 当您尝试删除它时,它不会起作用,因为它与您放置在地图上的标记不同。

  3. 因此您需要将标记存储在数组中,并在删除时从数组中获取图标并将其从地图中删除。

首先您需要创建 GMSMarker 的数组,因为您必须存储放置在地图上的每个标记。

因此,在 class.

顶部写下以下代码行
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 { [=12=].map = nil }
    }
    print(carNumber)
    motorisedVehicleButtonActive = !motorisedVehicleButtonActive
}

以上代码将从地图中删除所有标记。

我希望这对你有用。