2015-03-10 2 views
0

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

Я создал пользовательский аннотацию, как так:

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

} 

}

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

Благодаря

+0

Что именно не понятно? Если вам интересно, как вы знаете, какую аннотацию вызывает метод, это «view.annotation» (ссылка на добавленный вами объект annotationCustom'). – Anna

+0

То, что я не уверен, как это сделать, - это как только правый аксессуар вызывается, как я перейду к следующему контроллеру представления из indexPath этой конкретной аннотации. Я не знаю, как писать/делать это? –

+0

Не думайте и не используйте «indexPath» с аннотациями. У них нет определенного порядка отображения карты, например, строки в виде таблицы. Метод calloutAccessoryControlTapped дает прямую ссылку на рассматриваемую аннотацию, к которой вы обращаетесь, используя 'view.annotation'.** Что касается выполнения segue: ** см. Http://stackoverflow.com/questions/14805954/mkannotationview-push-to-view-controller-when-detaildesclosure-button-is-clicked. Он находится в Objective-C, но преобразовать его в Swift не составит труда. Также см. Http://stackoverflow.com/questions/26536080/swift-programmatically-set-segues. – Anna

ответ

0

Вместо:

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

Нет, это был не полный код, так как я уменьшил его, чтобы было легче понять, я снова редактировал свой код, когда функция запускается сейчас. Я просто не знаю, как передавать информацию в 'calloutAccessoryControlTapped'. Я не могу это решить ...? –