L.Rostek
L.Rostek

Reputation: 3

Swift: MapView calloutAccessoryControlTapped index

class MapViewController: UIViewController, MKMapViewDelegate, HomeModelProtocol {

var feedItems: NSArray = NSArray()
var selectedLocation : LocationModel = LocationModel()


@IBOutlet weak var mapView: MKMapView!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    let initialLocation = CLLocation(latitude: 45.444958, longitude: 12.328463)

    centerMapLocation(location: initialLocation)
    mapView.delegate = self

    let homeModel = HomeModel()
    homeModel.delegate = self
    homeModel.downloadItems()


}

func itemsDownloaded(items: NSArray) {
    feedItems = items

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

let regionRadus: CLLocationDistance = 1000
func centerMapLocation(location: CLLocation){
    let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, regionRadus, regionRadus)
mapView.setRegion(coordinateRegion, animated: true)
}

override func viewDidAppear(_ animated: Bool) {

    super.viewDidAppear(animated)
    //checkLocationAuthorizationStatus()
    displayLocations()
}
func displayLocations(){

    let i = feedItems.count
    var x = 0
    while x<i{
        let item: LocationModel = feedItems[x] as! LocationModel

        var poiCoodinates = CLLocationCoordinate2D()

        poiCoodinates.latitude = CDouble(item.latitude!)!
        poiCoodinates.longitude = CDouble(item.longitude!)!


        let pin: MKPointAnnotation = MKPointAnnotation()
        pin.coordinate = poiCoodinates
        self.mapView.addAnnotation(pin)

        pin.title = item.name
        pin.subtitle = item.address
        x = x+1
        }
    //return loc
    }

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

    let view = MKMarkerAnnotationView(annotation: selectedLocation as? MKAnnotation, reuseIdentifier: "pin")
    view.canShowCallout = true
    view.calloutOffset = CGPoint(x: -5, y: 5)
    view.leftCalloutAccessoryView = UIButton(type: .detailDisclosure)
    return view
}

func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {

    print(control.tag)
    selectedLocation = feedItems[0] as! LocationModel
    performSegue(withIdentifier: "InformationSegue", sender: self)


}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    // Get reference to the destination view controller
    let detailVC  = segue.destination as! InformationViewController
    // Set the property to the selected location so when the view for
    // detail view controller loads, it can access that property to get the feeditem obj
    detailVC.selectedLocation = selectedLocation
}
}

This is my code. I want to display the Location in the next Viewcontroller. I need to get the index at feeditems[]. How can i get the index in:

   func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl)

So how do i get the index, which Button is tapped. There are many objects that are placed in the map.

Thank you for help and sorry for my bad english, hope you guys understand me.

Upvotes: 0

Views: 998

Answers (3)

Srinivasan_iOS
Srinivasan_iOS

Reputation: 1088

1.Define subclasses for Annotation

class PointAnnotation: MKPointAnnotation {
    var indexAnnotation = 0

}

2.Mapview Delegate

    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
            if annotation.isMember(of: MKUserLocation.self) {
                return nil
            }
            let identifier = "myAnnotation"
            var annotationView: MKAnnotationView?
            annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
            if annotationView == nil {
                annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: identifier)
                annotationView?.image = UIImage(named:"Golf Courses.png")
                annotationView?.canShowCallout = true
                let callButton = UIButton(type: .detailDisclosure)
                annotationView?.rightCalloutAccessoryView = callButton
                annotationView?.sizeToFit()
            } else {
                annotationView!.annotation = annotation
            }

            }

3.Callaccessory button taped go to next view contoller

func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
        if control == view.rightCalloutAccessoryView {
            let obj = kStoryboardShops.instantiateViewController(withIdentifier: "ShopDetailsViewController") as! ShopDetailsViewController
            if let annotation = view.annotation as? PointAnnotation {
                obj.dicDetails = arrayOfItems[annotation.indexAnnotation]
            }
            let nav = UINavigationController(rootViewController: obj)
            self.present(nav, animated: true, completion: nil)
           }
        }

Upvotes: 0

Kosuke Ogawa
Kosuke Ogawa

Reputation: 7451

1.Define Sublass MKPointAnnotation.

class MyPointAnnotation: MKPointAnnotation {
    var feedItem: LocationModel
}

2.Set MyPointAnnotation.feedItem to feedItem.

let item: LocationModel = feedItems[x] as! LocationModel

var poiCoodinates = CLLocationCoordinate2D()
poiCoodinates.latitude = CDouble(item.latitude!)!
poiCoodinates.longitude = CDouble(item.longitude!)!

let pin: MyPointAnnotation = MyPointAnnotation()
pin.coordinate = poiCoodinates
pin.feedItem = item // Important!
self.mapView.addAnnotation(pin)

3.Get feedItem in calloutAccessoryControlTapped delegate method.

func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
    if let pin = view.annotation as? MyPointAnnotation {
        print(pin.feedItem)
    }
}

Upvotes: 0

Shehata Gamal
Shehata Gamal

Reputation: 100543

Sublass MKAnnotation add index property / object from feedItems array to the class and

see custom class MyAnnotation implemented there in swift customPinAnnotationButton

this idea but now i have only objective -c version

  - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
   NSLog(@"wqwqwqwqwqw . . .");

   MyAnnotation*ann = view.annotation;

   NSLog(@"nammemmeme : %@",ann.weatherItem);

  [self performSegueWithIdentifier:@"showDetails" sender:ann.weatherItem];

}

Upvotes: 0

Related Questions