按钮正在显示GMSMarkers,但没有隐藏它,我该如何同时执行

时间:2019-03-27 02:34:33

标签: swift xcode uibutton gmsmapview

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

此功能可从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 个答案:

答案 0 :(得分:1)

让我解释一下您的代码有什么问题。

  1. 每次按下按钮时,您都在创建新标记。因此,新标记的对象ID与旧标记不同。

  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
}

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

我希望这对您有用。