【问题标题】:How to access specific index of MKAnnotation如何访问 MKAnnotation 的特定索引
【发布时间】:2015-07-20 05:42:52
【问题描述】:

我有一个使用 MKAnnotations 填充标记的 mapView。我能够很好地获得注释数组。但是,我如何找出被点击的标记的索引?假设我点击了一个标记并弹出了 MKAnnotation。如何获取此注解实例?

ViewDidAppear 代码:

    for (var i=0; i<latArray.count; i++) {

    let individualAnnotation = Annotations(title: addressArray[i],
        coordinate: CLLocationCoordinate2D(latitude: latArray[i], longitude: longArray[i]))

    mapView.addAnnotation(individualAnnotation)
    }        
    //store annotations into a variable
    var annotationArray = self.mapView.annotations

    //prints out an current annotations in array
    //Result:  [<AppName.Annotations: 0x185535a0>, <AppName.Annotations: 0x1663a5c0>, <AppName.Annotations: 0x18575fa0>, <AppName.Annotations: 0x185533a0>, <AppName.Annotations: 0x18553800>]
    println(annotationArray)

注解类: 导入 MapKit

class Annotations: NSObject, MKAnnotation {
    let title: String
    //let locationName: String
    //let discipline: String
    let coordinate: CLLocationCoordinate2D

    init(title: String, coordinate: CLLocationCoordinate2D) {
       self.title = title
        self.coordinate = coordinate

    super.init()
}

var subtitle: String {
    return title
}
}

【问题讨论】:

    标签: ios mapkit


    【解决方案1】:

    MKMapViewDelegate 提供了一个委托方法mapView:annotationView:calloutAccessoryControlTapped: 实现此方法可为您提供您正在寻找的 MKAnnotation 实例的 MKAnnotationView。您可以调用MKAnnotationView 的annotation 属性来获取MKAnnotation 的对应实例。

    import UIKit
    import MapKit
    
    class ViewController: UIViewController, MKMapViewDelegate {
    
       @IBOutlet weak var mapView: MKMapView!
    
       var sortedAnnotationArray: [MKAnnotation] = [] //create your array of annotations.
    
       //your ViewDidAppear now looks like:
       override func viewDidAppear(animated: Bool) {
           super.viewDidAppear(animated)
           for (var i = 0; i < latArray.count; i++) {
             let individualAnnotation = Annotations(title: addressArray[i], coordinate: CLLocationCoordinate2D(latitude: latArray[i], longitude: longArray[i]))
             mapView.addAnnotation(individualAnnotation) 
             //append the newly added annotation to the array
             sortedAnnotationArray.append(individualAnnotation)
           } 
        }     
    
    
    
      func mapView(mapView: MKMapView!, annotationView view:    MKAnnotationView!, calloutAccessoryControlTapped control: UIControl!) {
           let theAnnotation = view.annotation
            for (index, value) in enumerate(sortedAnnotationArray) {
                if value === theAnnotation {
                    println("The annotation's array index is \(index)")
                }
            }
        }
    }
    

    【讨论】:

    • 嗨,贾德森,这个方法有效,但是它不是按创建标记的时间来组织的。似乎将标记随机拉入数组中。您知道如何按创建时间来组织索引吗?
    • mapView.annotations 数组未按注释添加到地图视图的时间排序。您可以保留自己的排序注释数组。因此,您从一个空数组开始,每次调用 mapView.addAnnotation() 时,还要将该注释添加到数组的末尾。结果将是一组从最早到最新排序的注释。然后,不要像上面那样循环遍历 mapView.annotations,而是遍历您创建的已排序的注释数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    相关资源
    最近更新 更多