1

I have multiple place marks on map. Have added tap gestures on them. Adding listener in for loop replacing tap one by one and only last marker is having a gesture. Local reference doesn't work at all it doesn't provide a tap. with strong reference only it works. not able to get an idea how can i have tap on all of them.

func showMarkers() {
    let mapObjects = yandexMapView.mapWindow.map.mapObjects
    mapObjects.clear()
    
    for pickupPoint in masterVC?.aryPickupPoints ?? [] {
        if pickupPoint.latitude != 0 && pickupPoint.longitude != 0 {
            let point = YMKPoint(latitude: pickupPoint.latitude!, longitude: pickupPoint.longitude!)
            
            let placemark = mapObjects.addPlacemark(with: point)
            placemark.userData = pickupPoint
            
            switch pickupPoint.pickupType {
            case 3:
                if let image = UIImage(named: "lockerPin") {
                    placemark.setIconWith(self.imageWithImage(image: image, scaledToSize: CGSize(width: 30, height: 40)))
                }
            default:
                if let image = UIImage(named: "otherPin") {
                    placemark.setIconWith(self.imageWithImage(image: image, scaledToSize: CGSize(width: 30, height: 40)))
                }
            }
            dLog("------------- \(point)----------------")
            
            // Client code must retain strong reference to the listener.
            yandexMapObjectTapListener = YandexMapObjectTapListener(controller: self)
            placemark.addTapListener(with: yandexMapObjectTapListener)
        }
    }

//MARK: - YandexMapObjectTapListener
private class YandexMapObjectTapListener: NSObject, YMKMapObjectTapListener {
    private weak var controller: UIViewController?
    var selectedPickupPoint: PickupPoint?

    init(controller: UIViewController) {
        self.controller = controller
    }

    func onMapObjectTap(with mapObject: YMKMapObject, point: YMKPoint) -> Bool {
        guard let marker = mapObject as? YMKPlacemarkMapObject else { return false }
        let pickupPoint = marker.userData as? PickupPoint
        let data = ["pickupPoint": pickupPoint as Any,
                    "marker": marker] as [String : Any]
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: NotificationObserver.ShowBottomSheet), object: nil, userInfo: data)
        return true
    }
}
Krutika Sonawala
  • 1,065
  • 1
  • 12
  • 30

0 Answers0