Выбор объекта по индексу в 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
}