63

アクションを実行できるように、View Controller がいつ nav スタックからポップされようとしているのかを知る必要があります。

-viewWillDisappear は使用できません。これは、View Controller が何らかの理由で画面外に移動したときに呼び出されるためです (新しい View Controller が上に押されるなど)。

特に、コントローラー自体がいつポップされようとしているのかを知る必要があります。

事前に感謝します。

4

15 に答える 15

87

viewWillDisappear提示された VC でメソッドをオーバーライドしisMovingFromParentViewController、オーバーライド内のフラグをチェックして、特定のロジックを実行します。私の場合、ナビゲーション コントローラーのツールバーを非表示にしています。提示された VC がプッシュされたことを理解する必要がありますが、完全ではありません。

于 2012-03-07T15:23:41.357 に答える
26

のカスタム サブクラスでwillMoveToParentViewController:(の代わりに)オーバーライドしてみてください。viewWillDisappear:UIViewController

ビュー コントローラがコンテナ ビュー コントローラに追加または削除される直前に呼び出されます。

- (void)willMoveToParentViewController:(UIViewController *)parent
{
    [super willMoveToParentViewController:parent];
    if (!parent) {
        // `self` is about to get popped.
    }
}
于 2013-10-25T05:04:46.390 に答える
14

これは私のために働いています。

- (void)viewDidDisappear:(BOOL)animated
{
    if (self.parentViewController == nil) {
        NSLog(@"viewDidDisappear doesn't have parent so it's been popped");
        //release stuff here
    } else {
        NSLog(@"PersonViewController view just hidden");
    }
}
于 2010-02-10T01:15:41.127 に答える
9

ここで釣れます。

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {

    if (viewController == YourAboutToAppearController) {
            // do something
    }
}

これは、新しいビューが表示される直前に発生します。まだ誰も動いていません。私は常に asinine NavigationController の前で魔法を使っています。タイトルとボタンのタイトルを設定して、そこで何でもできます。

于 2009-05-03T08:18:55.263 に答える
3

私も同じ問題を抱えてる。私はviewDisDisappearを試しましたが、呼び出される関数がありません:((私のVCがすべてUITableViewControllerであるため、理由はわかりません)。アレックスの提案は正常に機能しますが、ナビゲーションコントローラーが下に表示されている場合は失敗します[その他] タブ. この場合、nav コントローラーのすべての VC は、サブクラス化したナビゲーション コントローラーではなく、navigationController を UIMoreNavigationController として持っているため、VC がポップされようとしているときに nav から通知されません.最終的
に、私は問題を解決しましたUINavigationController のカテゴリで、単に書き直します - (UIViewController *)popViewControllerAnimated:(BOOL)animated

- (UIViewController *)popViewControllerAnimated:(BOOL)animated{
   NSLog(@"UINavigationController(Magic)");
   UIViewController *vc = self.topViewController;
   if ([vc respondsToSelector:@selector(viewControllerWillBePopped)]) {
      [vc performSelector:@selector(viewControllerWillBePopped)];
   }
   NSArray *vcs = self.viewControllers;
   UIViewController *vcc = [vcs objectAtIndex:[vcs count] - 2];
   [self popToViewController:vcc animated:YES];
   return vcc;}

それは私にとってはうまくいきます:D

于 2010-09-18T04:18:13.023 に答える
2

私はこれを試しました:

- (void) viewWillDisappear:(BOOL)animated {
    // If we are disappearing because we were removed from navigation stack
    if (self.navigationController == nil) {
        // YOUR CODE HERE
    }

    [super viewWillDisappear:animated];
}

アイデアは、ポップ時に、View Controller の navigationController が nil に設定されるということです。したがって、ビューが消えてしまい、ナビゲーション コントローラーがなくなった場合は、ポップされたと結論付けました。(他のシナリオでは機能しない可能性があります)。

ドキュメントに記載されていないため、ポップ時にviewWillDisappearが呼び出されることを保証できません。ビューが上面図と下面図のときに試してみましたが、両方で機能しました。

がんばれ、オデッド。

于 2011-03-31T10:24:57.450 に答える
1

これを使用できます:

if(self.isMovingToParentViewController)
{
    NSLog(@"Pushed");
}
else
{
    NSLog(@"Popped");
}
于 2015-07-03T07:51:29.113 に答える
0

おそらく、UINavigationBarDelegate の navigationBar:shouldPopItem プロトコル メソッドを使用できます。

于 2009-03-13T20:43:57.023 に答える
0

viewwilldisappear if ([self.navigationController.viewControllers indexOfObject:self] == NSNotFound) { //このビューのポッピングが発生しました。}

于 2014-02-21T08:38:31.140 に答える