54

ナビゲーションベースのアプリケーションを使用しています。First ViewController を Second ViewController にプッシュし、Second ViewController から Third ViewController にプッシュします。次に、3 番目の ViewController から 1 番目の ViewController にポップしたいと考えています。以下のコードを使用してこのタスクを実行していますが、アプリケーションがクラッシュしました。

何らかの適切なガイドラインを教えてください。別のviewControllerなので、rootViewControllerにpopを使用できません。前もって感謝します...

3 番目の ViewControler では、次のように記述しました。

FirstViewCtr *x=[[FirstViewCtr alloc] initWithNibName:@"FirstViewCtr" bundle:nil];
[self.navigationController popToViewController:x animated:NO];
4

16 に答える 16

95

最初の行を書き込むことにより、すべてのView Controllerのインデックスを取得し、2番目の行から目的地に到達します。

NSArray *array = [self.navigationController viewControllers];

[self.navigationController popToViewController:[array objectAtIndex:2] animated:YES];
于 2010-06-12T09:15:58.343 に答える
80

より安全なアプローチ:

- (void)turnBackToAnOldViewController{

    for (UIViewController *controller in self.navigationController.viewControllers) {

        //Do not forget to import AnOldViewController.h
        if ([controller isKindOfClass:[AnOldViewController class]]) { 

            [self.navigationController popToViewController:controller
                                                  animated:YES];
            return;
        }
    }
}
于 2013-02-21T13:12:33.343 に答える
20

迅速な方法:

     let dashboardVC = navigationController!.viewControllers.filter { $0 is YourViewController }.first!
     navigationController!.popToViewController(dashboardVC, animated: true)
于 2015-12-21T13:59:16.617 に答える
6
- (void) RetunToSpecificViewController{

   for (UIViewController *controller in self.navigationController.viewControllers)
    {
           if ([controller isKindOfClass:[AnOldViewController class]])
           {
            //Do not forget to import AnOldViewController.h

                       [self.navigationController popToViewController:controller
                                                             animated:YES];
                        break;
            }
    }
}
于 2015-04-28T07:41:55.750 に答える
1

コードは、スタックにプッシュされたことのないビューの新しいインスタンスを作成し、そのコントローラーにポップバックしようとします。

ルートView Controllerに戻る場合は、次を使用できますpopToRootViewControllerAnimated:

既知の距離をポップバックしている場合は、popViewControllerAnimated:複数回呼び出すことができます。あなたの例では、それは2つのコントローラーになるので、呼び出します。viewControllersコントローラー 2 を最後から探してポップすることで、同じことができます。

上記の提案は簡単な修正です。1 つのベスト プラクティス シナリオは、戻りたいコントローラーを、プッシュする連続する各コントローラーに渡すことです。最初は自分自身を 2 番目に渡し、2 番目は 3 番目を参照するパスを渡し、3 番目は渡された参照 (1 番目) をポップします。

実際には、一時的なルート コントローラーを作成しています。一時的なルートにポップしてクリアするプロパティとメソッドをサブクラス化UINavigationControllerして追加できます。最初に秒をプッシュすると、スタック内のすべてのコントローラーが参照を渡す必要がないように、一時的なルートとして設定されます。クリアせずに一時ルートを通過しないようにするために、いくつかの追加チェックを追加する必要があります。temporaryRootpopToTemporaryRootViewControllerAnimated:

于 2010-06-12T05:47:57.920 に答える
0

関数をUIViewController 1 に入れます。Specific がthenまたは else にUIViewController存在するかどうかをチェックしますUINavigationControllerpopToViewControllerpushViewController

func navigate(_ navVC: AnyClass, pushVC: UIViewController) {
    for obj in self.navigationController!.viewControllers {
        if obj.isMember(of: navVC) {
            self.navigationController!.popToViewController(obj, animated: true)
            return
        }
    }
    self.navigationController!.pushViewController(pushVC, animated: true)
}

使用する

self.navigate(ViewController.self, pushVC: self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController)
于 2018-05-15T07:36:46.310 に答える