2015-05-07 2 views
0

У меня есть массив широт и долгот вместе с другими материалами, и я хочу создать аннотации в виде карты. Я использую MapKit.Вызвать действие из аннотаций в виде карты

Когда пользователь нажимает выноску аннотации, я собираюсь представить другой контроллер. Я не могу найти индекс элемента массива, который использовался для создания этой конкретной аннотации.

Ниже приведен мой код.

У меня есть переменная Int

var annotationIndex = 0 

Это где я добавить аннотации

func addAnnotation(latitude: Double, longitude: Double, title: String, subTitle: String?) { 
    if (latitude >= -90 && latitude <= 90) && (longitude >= -180 && longitude <= 180) { 
     let location = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) 
     let span = MKCoordinateSpanMake(0.05, 0.05) 
     let region = MKCoordinateRegion(center: location, span: span) 
     mapView.setRegion(region, animated: true) 

     let annotation = MKPointAnnotation() 
     annotation.coordinate = location 
     annotation.title = title 
     annotation.subtitle = subTitle 
     mapView.addAnnotation(annotation) 
    } 
} 

Это метод MKMapViewDelegate настроить аннотацию

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! 
{ 
    if !(annotation is MKPointAnnotation) 
    { 
     return nil 
    } 

    let reuseId = "test" 
    var aView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId) 
    aView.canShowCallout = true 

    let btn = UIButton.buttonWithType(UIButtonType.DetailDisclosure) as! UIButton 
    btn.addTarget(self, action: "btnDisclosureAction:", forControlEvents: UIControlEvents.TouchUpInside) 
    btn.tag = annotationIndex 
    annotationIndex++ 

    aView.rightCalloutAccessoryView = btn 

    return aView 
} 

Это кнопка rightCalloutAccessoryView действий

func btnDisclosureAction(sender: UIButton) { 
    println(sender.tag) 
} 

Прямо сейчас я просто печатаю тег кнопки с надстройкой выноски, который я пытаюсь установить с помощью переменной annotationIndex.

Поскольку annotationView повторно используется, я не могу получить точное значение индекса. Есть ли лучший способ сделать это?

+0

Ниже приведен мой код. Но где ? –

+0

извините, добавлено – Matt

+0

Я могу помочь вам с Objective-C, если вы можете преобразовать его в быстрый. –

ответ

3

Подкласс MKPointAnnotation имеет значение индекса.

class 
Annotation : MKPointAnnotation { 
    var index = 0 
} 

И установить индекс при создании аннотации. Индекс

let annotation = Annotation() 

    : 

annotation.subtitle = subTitle 
annotation.index = annotationIndex++ 

Pass аннотация появляется в БТН

btn.addTarget(self, action: "btnDisclosureAction:", forControlEvents: UIControlEvents.TouchUpInside) 
btn.tag = (annotation as! Annotation).index 

EDIT: Так что ваш viewForAnnotation будет

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! 
{ 
    if !(annotation is Annotation) 
    { 
     return nil 
    } 

    let reuseId = "test" 
    var aView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId) 
    aView.canShowCallout = true 

    let btn = UIButton.buttonWithType(UIButtonType.DetailDisclosure) as! UIButton 
    btn.addTarget(self, action: "btnDisclosureAction:", forControlEvents: UIControlEvents.TouchUpInside) 
    btn.tag = (annotation as! Annotation).index 

    aView.rightCalloutAccessoryView = btn 

    return aView 
} 
+0

Вы можете отправить код для "viewForAnnotation"? – Matt

+1

Использование пользовательского подкласса вместо MKPointAnnotation _is_ происходит в правильном направлении. Тем не менее, тег кнопки (и addTarget) не нужен, так как отображение карты вызовет метод делегата calloutAccessoryControlTapped при просмотре аксессуаров (для этого не требуется метод обработчика пользовательских кнопок). В этом методе делегата аннотация извлекается с помощью 'view.annotation'. Если вы примените его к пользовательскому классу аннотаций, вы можете непосредственно получить свойство пользовательского индекса из аннотации. – Anna

+0

Спасибо Satachito. Я пробовал то же самое, но ничего не случилось. Знаете ли вы какую-либо ссылку, которая показывает, как подкласс MKPointAnnotation? Я в этом то, где моя ложь. – Matt

0

Укажите indexselected в качестве переменной класса и initilise его с -1 в viewDidLoad метод, как

override func viewDidLoad() { 
    super.viewDidLoad() 
    indexselected = -1 
} 

Вы можете получить свой индекс аннотации, пока пользователь нажимает аннотацию, а метод didSelectAnnotationView вызывается автоматически.

func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!) { 
    var selectedAnnotation : MKPointAnnotation = MKPointAnnotation() 
    selectedAnnotation = view.annotation as! MKPointAnnotation 
    for var i = 0; i<yourlist.count ; i++ { 
     let strtitle : String = yourlist.objectAtIndex(i).title as! String 
     if selectedAnnotation.title == strtitle { 
      indexselected=i 
      break 
     } 
    } 
} 

Мы можем получить индекс аннотаций путем сравнения заголовка на аннотацию и название из вашего массива, и сохраните индекс из массива. При выборе метода кнопки вы можете использовать этот индекс.

func btnDisclosureAction(sender: UIButton) { 
    println(indexselected) 
} 

Надеюсь, это поможет вам.

+0

Спасибо @ Вирал, но я думаю, что ответ Satachito решил мою проблему, потому что я мог бы получить те же заголовки, которые определенно будут проблемой. В любом случае, спасибо за ваше время. – Matt

+0

Добро пожаловать @Matt, ответ Сатахито также является хорошим способом добиться того, чего вы хотите. –

Смежные вопросы