2010-12-10 7 views
1

これは実際には解決されていますが、なぜ私が何をしたのか分かりません。iPhone SDK - 通知が複数回発生し、複数のビューがスタックにプッシュされる

私の問題は、一度通知を送信すると、1つのイベントが複数回発生するということでした。私はスタック上のいくつかの望ましくないビューに終わった。ナットシェルで:

ユーザは、通知がデリゲート

mapItem = [[UIBarButtonItem alloc] initWithImage:mapImage style: UIBarButtonItemStylePlain target:self action:@selector(mapButtonPressed:)]; 

-(void)mapButtonPressed:(id)sender{ 
    NSLog(@"Map Button Pressed"); 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"mapButtonPressed" object:nil ] ; 
} 

これはスタックにマップビューをプッシュする現在のビューで機能を起動から送信される、ツールバーのボタンを押します。 (結果はopenListMap機能はまだ複数回発射するものの、ということである

[self.navigationController pushViewController:mapViewController animated:YES]; 

:に

CultureNOWAppDelegate *delegate = 
    [[UIApplication sharedApplication] delegate]; 
    [delegate.navigationController pushViewController:mapViewController 
             animated:YES]; 

-(void)openListMap:(NSNotification *)aNotification { 

    mapViewController = [[MapViewController alloc] initWithNibName:@"MapViewController" bundle:nil]; 

    NSLog(@"Map Created"); 

    mapViewController.searchLocation = searchLocation; 
    if(givenLocationType == @"input"){ 
     mapViewController.inputLocationText = inputLocationText; 
    } 
    mapViewController.givenLocationType = givenLocationType; 

    CultureNOWAppDelegate *delegate = 
    [[UIApplication sharedApplication] delegate]; 
    [delegate.navigationController pushViewController:mapViewController 
             animated:YES]; 

} 

これが機能するようになりましたが、私はからの最後の行を変更しましたあなたはコンソールで見ることができます、ログ出力は、アプリケーションが開始されてからビューが現れたたびに「Map Created」を表示します)、最新のmapViewをthスタック。

なぜですか?なぜ最初から何度も発砲していたのですが、なぜ、すべての目的と目的が同じである2つのコードを交換して停止したのですか?

ありがとうございました。

+0

appDelegateにnavControllerをプッシュし、このviewController(またはそれが何であれ)をnavControllerにプッシュすることとの間に意味のある違いがあります。同じnavControllerに対処しているので、同じであることを意味しますか?私は彼らがそうは思わない。 –

+0

はい、それは私がそれを理解する方法です。しかし、私の経験はかなり限られています。あなたは実際に起こっていると信じていることを説明できますか?コードの長いほうが代替代理人を作成していますか?洞察に感謝します。 – dgig

答えて

5

2回発砲しているという事実は、あなたの「修正」は実際には修正ではないことを警告します。あなたが望むことをやっているのはAppleのAPIの動作です。

私は、通知が不可解に2回実行されたアプリで同様の問題が発生しました。私が後で気づいたのは、通知は一度しか呼び出されないということでしたが、NSNotificationCenterの中には、まったく同じセレクタコールバックの正確な同じイベントに対して2人のオブザーバーを登録することを止めるものは何もありません。

私たちはviewDidLoadにオブザーバーを追加したが、viewDidUnloadではオブザーバーを削除していないため、これが起こった。その後、ユーザーの携帯電話のメモリが足りなくなると(iOS4 +ではアップルに感謝します)、ビューがフラッシュされ、viewDidLoadが2度目に呼び出されたときに2人の観察者になります。

これはあなたの正確な問題ではないかもしれませんが、私はあなたがオブザーバーの通知をどこに登録しているかについて聞きたいと思います。

+0

ああ、それは興味深い点です。私はviewDidLoadでそれらを呼び出させて、オブザーバーを削除することはありません。これはおそらく同様の問題です。 – dgig

+0

「テストする」方法は、それが起こらないかどうかを確認することです。別のビューが読み込まれたときにSimulatorで「Simulate Memory Warning」をクリックし、再度そのビューに移動して再生するかどうかを確認します。 – makdad

関連する問題