5

こんにちは、私が行くはずのアプリケーションを開発しています:

  1. UIViewController1からUIViewController2
  2. UIViewController2からUIViewController3
  3. UIViewController3からUIViewController4
  4. UIViewController4から2UIViewControllerに戻る

を使用してUINavigationControllerいます。私が使用する[self.navigationController pushViewController:VC2 animated:NO];と、[self.navigationController popViewControllerAnimated:NO];すべてが正常に機能します。

しかし、私が4つのアプリケーション[self.navigationController popToViewController:VC2 animated:NO];から使用すると、言って終了しますUIViewControllerTerminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Tried to pop to a view controller that doesn't exist.'

以下は私のコードで、どのようにUIViewController2にポップしていますか

for (UIViewController *vc in self.navigationController.viewControllers) {
            if ([vc isKindOfClass:[ViewController2 class]]) {
                UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
                ViewController2 *VC2 = [storyboard instantiateViewControllerWithIdentifier:@"ViewController2"];
                [self.navigationController popToViewController:VC2 animated:NO];
            }
        }

ナビゲーション配列を印刷するとUIViewController、スタックに 2 と表示されます。UINavigationControllerEditor->embed in->Navigation Controller から追加しました

なぜこれが起こっているのか誰か教えてもらえますか?この問題を検索しようとしましたが、何も役に立ちません

4

3 に答える 3

18

ここでは、新しい VC2 ビュー コントローラー インスタンスをインスタンス化します。これは、ナビゲーション ビュー コントローラー スタックにあるインスタンスではありません。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
            ViewController2 *VC2 = [storyboard     instantiateViewControllerWithIdentifier:@"ViewController2"];

したがって、適切なインスタンスを見つける必要があります

[[self.navigationController] viewControllers]

解決策1:(iDevが言ったように、スタック上の2番目のView Controllerにジャンプし、2番目のものであることがわかっている場合はこれを使用してください)

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];

解決策 2: (通常、スタックの 2 レベルに戻る)

NSUInteger ownIndex = [self.navigationController.viewControllers indexOfObject:self];
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:ownIndex - 2] animated:YES];
于 2014-08-05T10:01:03.030 に答える
9

それはあなたのコードです:

for (UIViewController *vc in self.navigationController.viewControllers) {
    if ([vc isKindOfClass:[ViewController2 class]]) {
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
        ViewController2 *VC2 = [storyboard instantiateViewControllerWithIdentifier:@"ViewController2"];
        [self.navigationController popToViewController:VC2 animated:NO];
    }
}

vcが の一種でViewController2あり、既にナビゲーション スタックにあることはすでにお気づきかもしれません。VC2の時点で作成した新しいインスタンスは、ナビゲーション スタックにViewController2はありませ

例外の本文を参照してください。

キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: '存在しないビュー コントローラーにポップしようとしました。

したがって、ナビゲーション スタックにプッシュされていないビュー コントローラーに戻る必要があります。これにより、クラッシュが発生します。

すでにスタックにあるView Controllerに戻る必要があります-それはあなたのvcです:

for (UIViewController *vc in self.navigationController.viewControllers) {
    if ([vc isKindOfClass:[ViewController2 class]]) {
        [self.navigationController popToViewController:vc animated:NO];
    }
}
于 2014-08-05T10:06:21.883 に答える
5

この行を試して、ビューコントローラーを2番目にポップしてください

  [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
于 2014-08-05T09:39:56.753 に答える