Выбор объекта по индексу в MapView в SWIFT

Я пытаюсь представить другой контроллер представления, как только нажата правая кнопка выноски, но она должна перейти на правильный indexPath, аналогично тому, как это происходит в табличном представлении. вот где я до:

Я создал пользовательскую аннотацию примерно так:

class annotationCustom: NSObject, MKAnnotation {

    var coordinate : CLLocationCoordinate2D
    var title : NSString!
    var subtitle : NSString!
    var isUserAnnotation : Bool
    var dataImage = [NSData]()

    init(coordinate: CLLocationCoordinate2D, title: NSString!, subtitle: NSString!){

        self.coordinate = coordinate
        self.title = title
        self.subtitle = subtitle
        self.isUserAnnotation = false
    }
}

а затем установите viewForAnnotation вот так:

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {

        var dqPin = "pin"

        var view = mapView.dequeueReusableAnnotationViewWithIdentifier(dqPin) as? MKPinAnnotationView

                view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: dqPin)
                view!.canShowCallout = true

                    var arrowBut = UIImage(named: "arrow")
                    var arrowButton = UIButton()
                    arrowButton.setImage(arrowBut, forState: UIControlState.Normal)
                    arrowButton.tintColor = UIColor.blackColor()
                    arrowButton.frame = CGRectMake(0, 0, 30, 30)
                    view!.rightCalloutAccessoryView = arrowButton
                   }
             return view
             }

Теперь я знаю, что должен использовать функцию:

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

        if control == view.rightCalloutAccessoryView {

        let sb = UIStoryboard(name: "Main", bundle: nil)
        let userProfileVC = sb.instantiateViewControllerWithIdentifier("usersProfileVC") as UsersProfilesViewController

                userProfileVC.profileName = annotationCustom.title // error: 'annotationCustom.Type' does not have a member named 'title'

        performSegueWithIdentifier("goToUserFromMap", sender: self)
    }

}

}

Может кто-нибудь заполнить пробелы или помочь мне, пожалуйста.

Спасибо

1 ответ

Вместо:

if control == annotationView.rightCalloutAccessoryView {

так должно быть:

if control == view.rightCalloutAccessoryView {

view является внутренним, частным именем параметра и annotationView это внешнее имя, видимое для звонящего.

Однако в этом случае вам не нужно проверять control во-первых, так как ваши выноски имеют только один элемент управления (rightCalloutAccessoryView). У них нет leftCalloutAccessoryView так что есть только один элемент управления, который пользователь может нажать.

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

    println("disclosure pressed on: \(view.annotation.title)")

}


Кстати, это код, показанный в viewForAnnotation актуальный код? Потому что это выглядит как результат dequeueReusableAnnotationViewWithIdentifier игнорируется и происходит таинственное дополнительное закрытие } перед return view,


Вот:

userProfileVC.profileName = annotationCustom.title

annotationCustom это имя вашего класса, а не его экземпляр (также условно начинать имена классов с заглавной буквы). view.annotation это пример здесь. Брось как annotationCustom для доступа к любым пользовательским свойствам (хотя title не обычай):

if let ac = view.annotation as? annotationCustom {
    userProfileVC.profileName = ac.title
}
Другие вопросы по тегам