我正在努力防止信息窗口消失。为了展示它我用过
[mapView_ setSelectedMarker:marker];
但是当用户在某处点击地图时,信息窗口就会消失。我尝试将其重新设置为,didTapAtCoordinate
但在取消选择任何标记之前会调用它。怎么做?
我正在努力防止信息窗口消失。为了展示它我用过
[mapView_ setSelectedMarker:marker];
但是当用户在某处点击地图时,信息窗口就会消失。我尝试将其重新设置为,didTapAtCoordinate
但在取消选择任何标记之前会调用它。怎么做?
对于任何想在Swift 4中测试 Hanton 解决方案的人,简化为在页面加载后始终显示信息窗口:
override func viewDidLoad() {
mapView.addObserver(self, forKeyPath: "selectedMarker", options: [.new, .old], context: nil)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "selectedMarker" {
if change?[.newKey] as? NSObject is NSNull {
mapView.selectedMarker = change?[.oldKey] as? GMSMarker
}
}
}
这确实有效,尽管当用户点击时信息窗口会短暂闪烁并消失并重新出现。
Key Value Observing 是本案例的设计模式。这个答案对我有用。
- (void)viewDidLoad {
[super viewDidLoad];
self.shouldShowInfoView = NO;
[self.mapView addObserver:self
forKeyPath:@"selectedMarker"
options:(NSKeyValueObservingOptionNew |
NSKeyValueObservingOptionOld)
context:NULL];
}
- (void)needToShowInfoView {
self.shouldShowInfoView = YES;
}
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if ([keyPath isEqual:@"selectedMarker"]) {
if (self.shouldShowInfoView) {
if ([[change objectForKey:NSKeyValueChangeNewKey] isKindOfClass:[NSNull class]]) {
self.mapView.selectedMarker = [change objectForKey:NSKeyValueChangeOldKey];
}
}
}
}