2011-11-05 26 views
6

これは初心者の質問に聞こえるかもしれませんが、私は新しいiOS開発者です。navigationController.delegateを変更すると不正なアクセスが発生する

私はnavigationControllerにプッシュされたビューを持っています.3番目のプッシュビューです。 その視点で私はself.navigationController.delegate = self;を設定しました。代理人を変更しました。ユーザーが以前のビュー(現在のビューからのポップ)に移動したときのケースを処理する必要があるためです。

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    if ([[viewController class] isEqual:[MainViewController class]]) { 
     ... 
    } 
} 

それはOKに動作しますが、私はもう一度ボタンを押して、現在のビューとナビゲーションをバックポップとき、私は悪いアクセスエラーを取得しています(つまり最初のビューをプッシュするために切り替えます)。

私は何が欠けていますか? ナビゲーションの戻るボタンを押しても正しい方法は何ですか?

答えて

3

ナビゲーションコントローラがポップされたビューコントローラと割り当て解除されたビューコントローラにメッセージを送信するため、ポップアップとプッシュを行うたびにデリゲートを設定する必要があります。また、あなたのviewControllerのdeallocメソッドにself.navigationController.delegate = nil;を追加してください。 ViewControllerで以下

+0

は、第三ビューはUINavigationControllerDelegate実装=自己self.navigationController.delegateを割り当てます他にはないのですか?では、すべてのビューで、どこにデリゲートを自己に設定する必要がありますか? – deimus

+1

私はあなたが正しくデリゲートを得た場合は、ビューでnilに設定する必要があります。 少なくとも私はそうしたし、うまくいくようです...確認してください。 – deimus

+0

もちろん、それぞれのView Controllerに対して設定する必要があります。確認してください。デリゲートをnilに設定すべき理由は、ポインター(割り振り解除されたメモリーへのポインター)がぶら下がるのを避けるためです。 EXC_BAD_ACCESSは、通常、割り当てられていないオブジェクトにメッセージを送信したとき、およびナビゲーションコントローラの代理人がそのエラーを受け取った割り当て解除されたオブジェクトだったときに発生します。 – Eugene

0

場所とは、あなたが私の場合は... を助けなかったのdeallocでnilにデリゲートを設定し、実際に

-(void) viewWillDisappear:(BOOL) animated 
{ 
    [super viewWillDisappear:animated]; 
    if ([self isMovingFromParentViewController]) 
    { 
     if (self.navigationController.delegate == self) 
     { 
      self.navigationController.delegate = nil; 
     } 
    } 
}