Swift:MapView calloutAccessoryControlTapped索引

时间:2018-01-27 18:48:39

标签: ios swift mapkit

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
}
}

这是我的代码。 我想在下一个Viewcontroller中显示Location。 我需要在feeditems []获取索引。 我如何获得索引:

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

那么我如何获得索引,哪个Button被点击。地图中放置了许多对象。

谢谢你的帮助,抱歉我的英文不好,希望你们能理解我。

3 个答案:

答案 0 :(得分:0)

子类 MKAnnotation 将feedItems数组中的索引属性/对象添加到类中,并且

在swift customPinAnnotationButton

中查看自定义类 MyAnnotation

这个想法,但现在我只有目标-c版

  - (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];

}

答案 1 :(得分:0)

1.定义子类MKPointAnnotation。

class MyPointAnnotation: MKPointAnnotation {
    var feedItem: LocationModel
}

2.将MyPointAnnotation.feedItem设置为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.在calloutAccessoryControlTapped委托方法中获取feedItem

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

答案 2 :(得分:0)

1。定义注释的子类

class PointAnnotation: MKPointAnnotation {
    var indexAnnotation = 0

}

2.Mapview委托

    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按钮转到下一个视图控制器

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)
           }
        }