1. ホーム
  2. ios

[解決済み] viewWillDisappear: ビューコントローラがポップされているか、サブビューコントローラが表示されているかを判断します。

2022-06-09 10:05:14

質問

この問題に対する良い解決策を見つけるのに苦労しています。あるビューコントローラの -viewWillDisappear: メソッドにおいて、ビューコントローラがナビゲーションコントローラのスタックにプッシュされたためなのか、ビューコントローラがポップされて消えたためなのかを判断する方法を見つける必要があります。

今のところ、私は以下のようなフラグを設定しています。 isShowingChildViewController などを設定していますが、かなり複雑になってきています。唯一、検出できそうなのは -dealloc メソッドです。

どのように解決するのですか?

以下を利用するとよいでしょう。

- (void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];
  NSArray *viewControllers = self.navigationController.viewControllers;
  if (viewControllers.count > 1 && [viewControllers objectAtIndex:viewControllers.count-2] == self) {
    // View is disappearing because a new view controller was pushed onto the stack
    NSLog(@"New view controller was pushed");
  } else if ([viewControllers indexOfObject:self] == NSNotFound) {
    // View is disappearing because it was popped from the stack
    NSLog(@"View controller was popped");
  }
}

これはもちろん、UINavigationControllerのビューコントローラスタック(viewControllersプロパティを通じて公開)が、viewWillDisappearが呼び出されるまでに更新されているから可能なのですが、viewWillDisappearが呼び出された時点で、UINavigationControllerのビューコントローラスタックは更新されています。