按钮显示 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()
}
让我解释一下您的代码有什么问题。
每次按下按钮时,您都在创建新标记。因此,新标记与旧标记具有不同的对象 ID。
当您尝试删除它时,它不会起作用,因为它与您放置在地图上的标记不同。
因此您需要将标记存储在数组中,并在删除时从数组中获取图标并将其从地图中删除。
首先您需要创建 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
}
以上代码将从地图中删除所有标记。
我希望这对你有用。
我正在创建一个显示不同位置的应用程序。目前,当按下一个按钮时,汽车位置会在地图上弹出,但是如果再次按下同一个按钮,我想隐藏那些显示的标记。
这是从 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()
}
让我解释一下您的代码有什么问题。
每次按下按钮时,您都在创建新标记。因此,新标记与旧标记具有不同的对象 ID。
当您尝试删除它时,它不会起作用,因为它与您放置在地图上的标记不同。
因此您需要将标记存储在数组中,并在删除时从数组中获取图标并将其从地图中删除。
首先您需要创建 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
}
以上代码将从地图中删除所有标记。
我希望这对你有用。