未调用 didSelectAnnotationView
Posted
技术标签:
【中文标题】未调用 didSelectAnnotationView【英文标题】:didSelectAnnotationView not called 【发布时间】:2014-12-30 01:41:16 【问题描述】:我想在单击注释后使用它。我已经在 Apple 的文档中进行了查找,并且确实进行了谷歌搜索,但我找不到为什么这与应该如何完成有任何不同。
基本上;我没有收到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)
我已导入地图工具包并包含地图视图委托。
【问题讨论】:
地图视图的delegate
属性设置了吗?如果不是,则不会调用委托方法。还要确保注解的title
(设置为subject
)不是空白或nil。
两个不相关的事情:1)设置location
时,纬度设置为经度,经度设置为看起来向后的经度。 2) 编写的 viewForAnnotation 函数毫无意义。它返回一个视图,但代码对它没有任何作用,并且 它没有正确命名为地图视图的委托方法。它必须命名为func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView!
,并且必须设置地图视图的delegate
。你不应该直接调用它。
我认为我没有设置地图视图的委托。我现在将其设置为:mapView.delegate = self.现在,没有显示图钉(以前显示图钉,只是没有引发点击事件)
你实现了 mapView(mapView:viewForAnnotation:) 方法吗?如果你这样做了,把它注释掉,看看针脚是否显示。
如果我评论 mapView viewforannotation 功能,它会显示引脚。我用当前版本的 viewforannotation 更新了主帖。
【参考方案1】:
为了回答最初的问题,didSelectAnnotationView
很可能没有被调用,因为未设置地图视图的 delegate
属性。另一个常见原因是注释的title
为空白。
在更新后的问题中,引脚不会以 viewForAnnotation
的实现方式显示,因为它创建了一个 MKAnnotationView
但未设置其 image
属性。 MKAnnotationView
的 image
属性默认为 nil
,因此引脚存在但不可见。
如果你想显示标准的红色图钉,要么:
根本不实现viewForAnnotation
委托方法,地图视图将显示红色引脚默认情况下。
实现viewForAnnotation
委托方法并创建一个MKPinAnnotationView
,而不是自动显示“图钉”图像。
所以要么将 pin 的 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
【讨论】:
嗨,安娜,非常感谢您提供如此出色的答案。我的问题(正如您正确指出的那样)是我没有为视图设置标题。如果我不想设置标题怎么办?还有其他选择吗? 弗拉德,您找到问题的答案了吗?我还想制作一个包含标签的自定义视图。问题是,如果我设置标题,它会出现在我的视图中,但也出现在右侧,在我的自定义视图旁边 空白标题为我修复了它。更具体地说,我不小心删除了“- (NSString *)title;”我的 .h 文件中的声明。【参考方案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.
【讨论】:
canShowCallout = false
for Swift 为我解决了这个问题。谢谢:)【参考方案3】:
在最新版本的 Swift 中,方法声明已从以下更改:
func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!)
到这里:
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView)
【讨论】:
【参考方案4】:我想将此作为评论添加到 GOrozco58 答案,但没有足够的声誉发表评论。
如果您将 canShowCallout 设置为 YES,GOrozco58 是正确的,如果标题为 nil,则不会调用 didSelectAnnotation
。
如果您希望调用 didSelectAnnotation
并将 canShowCallout 设置为 YES,请确保添加标题。
【讨论】:
然后让你得到一些代表!【参考方案5】:在我的例子中,我使用了服装注释并且没有调用 didSelectAnnotationView,因为 custome 注释的 image 属性为空,所以我将其设置为 image 并开始调用 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;
【讨论】:
【参考方案6】:Anna 提出的未分配注释标题的建议是解决我的问题的方法。我花了一分钟来实现这个,我在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)
【讨论】:
以上是关于未调用 didSelectAnnotationView的主要内容,如果未能解决你的问题,请参考以下文章
numberOfRowsInSection 已调用但 cellForRowAt 未调用
调用 textFieldShouldBeginEditing,未调用 textFieldDidBeginEditing