MKAnnotation 坚持旧信息
Posted
技术标签:
【中文标题】MKAnnotation 坚持旧信息【英文标题】:MKAnnotation is persisting with old information 【发布时间】:2014-09-29 12:03:58 【问题描述】:我正在开发一个应用程序,在该应用程序中,一位农民将自定义注释(带有数字的大头针)放在他的作物感兴趣的点上,将带有屏幕截图的报告通过电子邮件发送回他的办公室,然后转移到他的下一个围场。
发送电子邮件的部分代码包括重置属性和归零数组和 ivars 等。他的第一个字段工作正常,但随后所有字段中的 POI 编号变得混乱。错误引脚表示的数据是正确的,只是引脚本身不正确(稍后会详细介绍>>**)。
所以我已经确定导致针掉落的任何事情都没有问题,并且我已经清除了我的注释:
[ self.mapView removeAnnotations:self.mapView.annotations];
Apple 文档提到还需要在重置中实现此方法:
[ self.mapView dequeueReusableAnnotationViewWithIdentifier:@"myAnnotation"];
因为即使它们已从屏幕上清除,它们仍然存在于内存中。然而,这仍然不能解决我的困惑。如果我使用以下命令明确删除我的注释:
self.mapView.annotations = nil;
问题仍然存在。注释上的数字在第 2 和第 3 .. 字段中随机出现。通过登录到屏幕上的 textView,我可以看到包含 POI 编号正确值的数组。关于 CLLocation 或 MKAnnotation 的某些东西仍然存在于某处。 Apple 的 Class Reference 中没有关于如何重置 CLLocationManager 的内容,所以我认为它是通过简单的 Start 和 Stop 完成的。我对这些的使用是正确平衡的,所以我没有运行多个实例。
**>> 这是决定要丢弃哪个引脚的 sn-p,动作发生在评论的中间
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation(id<MKAnnotation>)annotation
if([annotation isKindOfClass:[MKUserLocation class]])
return nil;
static NSString *identifier = @"myAnnotation";
MKAnnotationView * annotationView = (MKAnnotationView*)[self.mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
if (!annotationView)
annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
// standard stuff up to here
// findings build up as a score of each test point.
if (contentScore == 0)
// a green asterisk marker if no score was achieved
annotationView.image = [UIImage imageNamed:@"markerZero.png"];
else
// the marker number comes from idx in SiteCount Array
str = [NSString stringWithFormat:@"marker%d.png",siteCount[idx];
annotationView.image = [UIImage imageNamed:str];
else
annotationView.annotation = annotation;
return annotationView;
目前的解决方法是在主屏幕上将其从内存中取出并在开始下一个字段之前重新启动。我可以重新使用系统提供的红色和绿色图钉,但他被数字交叉引用报告所宠坏了。
那么我应该去哪里寻找?谁是罪魁祸首?我怀疑 MKAnnonation,但我的知识已经用完了
【问题讨论】:
The answer to your previous question (and the other answers it links to) 以同样的方式应用在这里。在 viewForAnnotation 中,代码使用外部变量 contentScore 和 idx 假设它们将与当前注释参数同步。此外,视图属性仅在创建时更新(因此出队/重复使用的视图显示旧的注释图像)。 自那个问题以来,我一直在让你的建议发挥作用,直到我放弃了历史方面。我遇到了数百个使用变量来确定的 SO 答案关于他们的别针和 OP 的事情很高兴。哦,再次工作,我会在圣诞节前后回到你身边。干杯。 当然,您可以使用变量来确定有关引脚的某些内容。但是这些变量必须直接与相关注释相关联,或者在创建视图或出列时应用代码。在上面显示的代码中,idx 不保证适用于当前注释,并且仅在创建视图时应用。 【参考方案1】:正如@Anna 所说,如果可重用视图出队,您并没有完全重新初始化注释视图 -
你应该有类似的东西
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation(id<MKAnnotation>)annotation
if([annotation isKindOfClass:[MKUserLocation class]])
return nil;
static NSString *identifier = @"myAnnotation";
MKAnnotationView * annotationView = (MKAnnotationView*)[self.mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
if (!annotationView)
annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
//Note this closing brace!
// standard stuff up to here
// findings build up as a score of each test point.
if (contentScore == 0)
// a green asterisk marker if no score was achieved
annotationView.image = [UIImage imageNamed:@"markerZero.png"];
else
// the marker number comes from idx in SiteCount Array
str = [NSString stringWithFormat:@"marker%d.png",siteCount[idx]; // As per @anna's comment I am not sure how you are managing this - It would be better if the number came from the associated annotation object
annotationView.image = [UIImage imageNamed:str];
annotationView.annotation = annotation;
【讨论】:
aaaahhhh 这解释了为什么他们有一天会打电话并说引脚在出击期间改变了数字。他们必须将视图滚动到屏幕边界之外,并且在重新排列引脚时完成了操作。是的,安娜在她的领域很出色,尤其是当她像他们一样站在场上时;-)以上是关于MKAnnotation 坚持旧信息的主要内容,如果未能解决你的问题,请参考以下文章
使用 CLGeocoder 将城市和州信息添加到 MKAnnotation
在实现 MKAnnotation 时如何获取 pin 的标题和副标题?