如何在不取消选择注释的情况下更新标注视图?

Posted

技术标签:

【中文标题】如何在不取消选择注释的情况下更新标注视图?【英文标题】:How do I update a callout view without deselecting the annotation? 【发布时间】:2014-09-03 09:03:03 【问题描述】:

到目前为止,我发现在已经可见的标注气泡中更新文本的唯一方法是取消选择其注释,然后再次选择它,如下所示:

id <MKAnnotation> annotation = self.selectedAnnotation; // Keep a reference
[self.mapView deselectAnnotation:self.selectedAnnotation animated:NO];
[self.mapView selectAnnotation:annotation animated:NO];

但是,这种方法会在我的应用中造成一些不必要的副作用。

有没有人知道其他方法可以做到这一点?

【问题讨论】:

您是指显示标题和副标题的标准标注视图吗?您如何更新代码中的标题和副标题?如果您使用标准属性设置器(例如ann.title = @"changed";)更新文本,则应在不取消选择+选择的情况下更新标注。 是的,我使用标准属性设置器(虽然间接,因为标题和副标题是只读的),但是在我自己定义的方法中,所以我猜取消选择+选择技巧通过调用一些重新创建标注的方法。你知道那可能是哪种方法吗? 如果直接使用setter设置title和subtitle,callout会自动更新,因为map view通过KVO观察变化​​。如果不能直接更新,则需要在更改之前/之后手动调用 willChangeValueForKey 和 didChangeValueForKey(而不是取消选择+选择)。见***.com/questions/5705678/…。 太棒了!谢谢安娜,这解决了我的问题=D 【参考方案1】:

Anna 在 cmets 中为我的问题提供了完美的解决方案!

通过明确通知 MKMapView(通过 KVO 监听更改)文本更改,我设法让标注更新,否则它不会。这是工作代码:

[annotation willChangeValueForKey:@"subtitle"];
annotation.subTitle = @"New subtitle";
// subTitle is the property behind MKAnnotation's subtitle
[annotation didChangeValueForKey:@"subtitle"];

感谢安娜前来救援 =)

【讨论】:

以上是关于如何在不取消选择注释的情况下更新标注视图?的主要内容,如果未能解决你的问题,请参考以下文章

颤振:如何在不按按钮的情况下进行列表视图更新?

Rails - 如何在不更改页面和更新视图的情况下提交表单?

如何在不滚动选择器视图的情况下选择当前时间

如何在不使用 @Composable 注释的情况下为撰写函数创建扩展?

如何在不重绘整个视图的情况下更新 NSView 的一部分

如何在不重建所有 RemoteView 的情况下部分更新应用小部件中的视图