1

吹き出し付きの 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 では、これがどのように機能するのかわかりません。何かご意見は?ありがとう。

4

1 に答える 1

0

モーダル ビューを閉じる直前に観察を停止する必要があります。

これを実現する最善の方法は、モーダル ビューを閉じる準備ができたときに MKMapView コントローラーに通知し、MKMapView の監視を停止してからモーダル ビューを閉じることです。

于 2012-05-30T03:22:30.190 に答える