web-dev-qa-db-ja.com

viewWillAppearで、navigationController pop(戻るボタン)の後に呼び出されたことを知ることができますか?

UIViewControllerAとBがあるとします。ユーザーはプッシュセグエでAからBに移動します。ユーザーが戻るボタンを押してAに来るより。

これで、AのviewWillAppearが呼び出されます。ここのコードで、戻るボタンから来たことを知ることができますか(navigationController popTo...)そして別の方法ではありませんか?そして、Bビューコントローラで特別なコードを書くことなく。

24
adsurbum

うーん、多分あなたはviewWillAppearself.isMovingToParentViewControllerを使うことができます。 docs を見てください。それがNOなら、それは現在のViewControllerがすでにナビゲーション上にあることを意味しますスタック。

31
falsecrypt

ビューコントローラAで次のことを行うのが好きです。

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    if (_popping) {
        _popping = false;
        NSLog(@"BECAUSE OF POPPING");
    } else {
        NSLog(@"APPEARING ANOTHER WAY");
    }

    //keep stack size updated
    _stackSize = self.navigationController.viewControllers.count;

    ....
}
- (void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    _popping = self.navigationController.viewControllers.count > _stackSize;

    ....
}

あなたがしていることは、View Controller(B)が押されているため、または別の理由でView Controller(A)が消えているかどうかを追跡することです。次に(子ビューコントローラーの順序を変更しなかった場合)、ナビゲーションコントローラーのポップが原因で(A)が表示されているかどうかを正確に通知する必要があります。

10
G Man

BOOLプロパティをUIViewControllerAに追加します。

@property (nonatomic) BOOL alreadyAppeared;

次に、あなたのviewWillAppear:メソッド、追加:

if (!self.alreadyAppeared) {
    self.alreadyAppeared = YES;
    // Do here the stuff you wanted to do on first appear
}
3
Gavin