吹き出し付きの MKMapView があります。コールアウト (詳細開示インジケーター) ボタンが押されると、detailViewController が表示されます。注釈のマップ タイプとピンの色を変更する機能を追加したいと考えています。だから私は現在これを行います:
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
DetailMapViewController *destination = [[DetailMapViewController alloc] initWithNibName:@"DetailMapViewController" bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:destination];
if ([destination respondsToSelector:@selector(setDelegate:)]) {
[destination setValue:self forKey:@"delegate"];
}
if ([destination respondsToSelector:@selector(setPlacemark:)]) {
[destination setValue:_currentPlacemark forKey:@"Placemark"];
}
if ([destination respondsToSelector:@selector(setMapTypeAsNum:)]) {
[destination setValue:[NSNumber numberWithInteger:self.mapView.mapType] forKey:@"mapTypeAsNum"];
[destination addObserver:self forKeyPath:@"mapTypeAsNum" options:NSKeyValueObservingOptionNew context:NULL];
}
if ([destination respondsToSelector:@selector(setColorAsNum:)]) {
[destination setValue:[NSNumber numberWithInteger:MKPinAnnotationColorPurple] forKey:@"colorAsNum"];
[destination addObserver:self forKeyPath:@"colorAsNum" options:NSKeyValueObservingOptionNew context:NULL];
}
[self presentModalViewController:navController animated:YES];
}
私のobserveValueForKeyPathメソッドでは:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
DetailMapViewController *destination = (DetailMapViewController *)object;
[destination removeObserver:self forKeyPath:@"mapTypeAsNum"];
[destination removeObserver:self forKeyPath:@"colorAsNum"];
if ([keyPath isEqualToString:@"mapTypeAsNum"]) {
if ([object isKindOfClass:[DetailMapViewController class]]) {
id mapType = [change objectForKey:NSKeyValueChangeNewKey];
self.mapView.mapType = [mapType integerValue];
}
}
else if ([keyPath isEqualToString:@"colorAsNum"]) {
if ([object isKindOfClass:[DetailMapViewController class]]) {
id pinColor = [change objectForKey:NSKeyValueChangeNewKey];
MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[self.mapView viewWithTag:10];
annotationView.pinColor = [pinColor integerValue];
}
}
}
これの問題は、DetailViewController でピンの色やマップの種類を変更してobserveValueForKeyPath メソッドを呼び出さないと、コンソールに従って観測情報が漏れてしまうことです。したがって、このようなシナリオでオブザーバーを追加してオブザーバーを削除する場所を考えていました。以前は NSNotificationCenter を使用していましたが、dealloc でオブザーバーを削除し、上記のコードのように detailViewController を提示する直前にオブザーバーを追加していました。しかし、KVO では、これがどのように機能するのかわかりません。何かご意見は?ありがとう。