DidSelectAnnotationView не вызывается
Я хотел бы работать с аннотацией после ее щелчка. Я посмотрел его на документацию Apple, и я сделал googled, но я не могу найти, почему это ничем не отличается от того, как это должно быть сделано.
В основном; Я не получаю println("Pin clicked");
Почему бы и нет?
func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView!
{
if !(annotation is MKPointAnnotation) {
return nil
}
let reuseId = "test"
var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)
if anView == nil {
anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
anView.canShowCallout = true
}
else {
anView.annotation = annotation
}
return anView
}
func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!)
{
println("Pin clicked");
}
func setAnnotationPinOnMap(annotation : NSManagedObject)
{
var subject: AnyObject? = annotation.valueForKey("subject")
var desc: AnyObject? = annotation.valueForKey("desc")
var langitude: AnyObject? = annotation.valueForKey("langitude")
var longitude: AnyObject? = annotation.valueForKey("longitude")
println(annotation);
let pin = MKPointAnnotation()
let location = CLLocationCoordinate2D(
latitude: longitude as CLLocationDegrees,
longitude: langitude as CLLocationDegrees
)
println(location.longitude, location.latitude)
pin.setCoordinate(location)
pin.title = subject as String!
pin.subtitle = desc as String!
println( pin.coordinate.longitude)
viewForAnnotation(pin);
mapView.addAnnotation(pin)
}
Я импортировал набор карт и включил делегат отображения карты.
Ответы
Ответ 1
Чтобы ответить на исходный вопрос, didSelectAnnotationView
, скорее всего, не получил вызов, потому что свойство map view delegate
не было установлено. Другая общая причина заключается в том, что аннотация title
пуста.
В обновленном вопросе контакты не будут отображаться с помощью способа viewForAnnotation
, поскольку он создает MKAnnotationView
, но не устанавливает его свойство image
. Свойство image
для MKAnnotationView
по умолчанию равно nil
, поэтому контакты там, но невидимы.
Если вы хотите отображать стандартные красные контакты, выполните следующие действия:
- Не используйте метод делегата
viewForAnnotation
вообще, и по умолчанию на карте будут отображаться красные контакты.
- Внедрите метод делегата
viewForAnnotation
и создайте вместо него MKPinAnnotationView
, который автоматически отобразит "контактный" образ.
Итак, либо установите контакт image
на какое-то пользовательское изображение:
anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
anView.canShowCallout = true
anView.image = UIImage(named:"CustomImage") // <-- add this line
или создайте вместо него MKPinAnnotationView
и, возможно, установите его pinColor
:
var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView
if anView == nil {
anView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
anView!.canShowCallout = true
anView!.animatesDrop = true
anView!.pinColor = .Purple // or Red or Green
}
else {
anView!.annotation = annotation
}
Ответ 2
В моем случае проблема заключалась в том, что я устанавливал свойство canShowCallout в YES, поэтому, если вы установите это свойство в YES
-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
не вызывается. когда я удалил это свойство, метод был вызван.
annotationView = [[ClusterAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
annotationView.canShowCallout = YES; //try setting to NO or don't set.
Ответ 3
В моем случае я использовал аннотацию костюма, и didSelectAnnotationView не вызывался из-за того, что свойство изображения для аннотации custome было пустым, поэтому я установил его в изображение и начал вызывать didSelectAnnotationView.
- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier{
self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
if (self != nil)
{
DoctorCustomeAnnotation *mapItem = (DoctorCustomeAnnotation *)self.annotation;
// offset the annotation so it won't obscure the actual lat/long location
self.centerOffset = CGPointMake(100, 100.0);
self.backgroundColor = [UIColor redColor];
PAImageView* avatarView = [[PAImageView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)
backgroundProgressColor:[UIColor whiteColor]
progressColor:[UIColor colorWithRed:0.092 green:0.383 blue:0.580 alpha:1.000]];
[self addSubview:avatarView];
self.image = [UIImage imageNamed:@"placeholder_male"];
[avatarView setImageURL:@"http://www.straine.com/wp-content/uploads/2015/12/doctor.png"];
}
return self;
}
Ответ 4
Я хотел добавить это в качестве комментария к ответу GOrozco58, но не имеет достаточной репутации для комментариев.
GOrozco58 прав, если у вас canShowCallout установлено значение YES, didSelectAnnotation
не будет вызываться, если заголовок равен нулю.
Если вы хотите, чтобы didSelectAnnotation
был вызван, а также установите canShowCallout на YES, убедитесь, что вы добавили заголовок.
Ответ 5
В последней версии Swift объявление метода изменилось:
func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!)
:
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView)
Ответ 6
Предложение о назначении аннотации, которое не было назначено, было решением моей проблемы. Мне потребовалась минута, чтобы реализовать это, и я сделал это в функции gestureRecognizer(). Вот мой пример:
@objc func handleLongPress(_ gestureRecognizer : UIGestureRecognizer) {
if gestureRecognizer.state != .began { return }
print("Tap gesture recognized")
// Create the annotation
let touchPoint = gestureRecognizer.location(in: mapView)
let newCoordinate = self.mapView.convert(touchPoint, toCoordinateFrom:self.mapView)
let annotation = MKPointAnnotation()
annotation.coordinate = newCoordinate
annotation.title = "placeholder"
// Add the annotation
mapView.addAnnotation(annotation)
}