6

MKMapView を呼び出すビュー コントローラーがあります。

[self.mapView setRegion:region animated:YES]; 

マップを A から B に再配置します。

MKMapView を保持するビュー コントローラーがデリゲートとして設定され、

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated

別の setRegion:animated: を MKMapView にトリガーするコードがいくつかあり、マップが新しい位置に自動的にズームインします。

popViewControllerAnimated の場合、すべて正常に動作します。MKMapView アニメーションがパンとズームを実行した後のビュー コントローラーです。

ただし、MKMapView がアニメーションを実行している間に popViewControllerAnimated: 現在のビュー コントローラーを実行しようとすると、「割り当て解除されたインスタンスにメッセージが送信されました」というメッセージが表示されてアプリがクラッシュします。

デバッガーの外観から、MKMapView はポップされ、割り当てが解除されたデリゲートからメソッドを呼び出そうとしていると思います。

だから私は試しました

[self.mapView setDelegate:nil];
self.mapView = nil;

viewDidUnload 運が悪い。アプリはまだ一貫してクラッシュします。

私が考えることができる唯一のことは、別の新しいデリゲート クラスを作成し、そのクラスを親ビュー コントローラーから保持して、それを含むビュー コントローラーの割り当てが解除された後でも、MKMapView が呼び出すデリゲートを持つようにすることでした。

なぜこうなった?他に「クリーン」なオプションはありますか?

4

5 に答える 5

14

友人がこれを手に入れるのを手伝ってくれました。

デフォルトのナビゲーション コントローラの戻るボタンを使用する代わりに、ビュー コントローラをポップする独自の方法を実装しました。[self.mapView setDelegate:nil]; を追加するだけでした。ビューコントローラーをポップする前に。

- (void)goBack
{
    [self.mapView setDelegate:nil];
    [self.navigationController popViewControllerAnimated:YES];
}
于 2011-09-02T01:26:35.813 に答える
8

OK、これが本当の答えです。Apple doc からのものですが、MKMapView にはありません。デリゲート プロトコルのドキュメントでのみ見つかります。

「デリゲートを設定した MKMapView オブジェクトを解放する前に、そのオブジェクトのデリゲート プロパティを nil に設定することを忘れないでください。これを行うことができる 1 つの場所は、マップ ビューを破棄する dealloc メソッドです。」

注: これは UIWebView にも適用されます。

デリゲートの dealloc メソッドで MapView のデリゲート ポインターを nil に設定したところ、クラッシュは解消されたようです。

于 2011-11-20T21:18:33.390 に答える
0

ビューコントローラーでMKMapViewのデリゲートをnilに設定しても問題は解決しませんでした

[self.mapView setDelegate:nil];

RootViewController に MKMapView を含む UIViewController の __strong 参照を作成する必要がありました。

__strong <#UIViewController#> *vcNewLocation;

于 2015-11-21T09:45:29.457 に答える
-1

次のコードは、問題を解決する可能性があります。

-(void) viewWillDisappear:(BOOL)animated
{
    self.mapView.delegate = nil;
    mapView=Nil;
    NSLog(@"viewWillDisappear");

}
于 2013-04-18T11:37:10.960 に答える