2

少し問題があります。A->B->C (-> はモーダル セグエ) ビュー A はルート ビュー コントローラーであり、C から A に戻る必要があります。 B からメソッド popToViewController を呼び出し、A は viewWillAppear を実行します。popToViewController を C から (A に) 呼び出すと、A の viewWillAppear は呼び出されません。どうすればこれを解決できますか? (Xcode7 と iOS 9 で動作)

ビューコントローラー A

#import "ViewControllerA.h"
#import "ViewControllerB.h"

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

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"goToB"]) {
       ViewControllerB *b = [segue destinationViewController];
    }
}

ビューコントローラー B

#import "ViewControllerB.h"
#import "ViewControllerC.h"

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

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"goToC"]) {
       ViewControllerC *c = [segue destinationViewController];
    }
}

- (IBAction)backToAButton:(id)sender {
    [self dismissViewControllerAnimated:NO completion:nil];
}

ビューコントローラー C

#import "ViewControllerC.h";

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

    [self setupSceneC];
}


- (IBAction)backToBButton:(id)sender {
    [self dismissViewControllerAnimated:NO completion:nil];
}

- (IBAction)backToAButton:(id)sender {
    [[self parentViewController] dismissViewControllerAnimated:NO completion:nil];
}
4

2 に答える 2

1

以下に示す2 つのCASESのいずれかを実装すると、間違いなくviewWillAppear正しく記述されていることを確認できます。super

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // Your code goes here
}

ケース 1 - ナビゲーション コントローラーの使用

ある ViewController から別の ViewController にポップするには、それらすべてを同じナビゲーション スタックに配置する必要があります。これは、新しいView Controllerを開くたびに、次のようなことをする必要があることを意味します:

 [self.navigationController pushViewController:nextVC animated:YES];

これを行う代わりに

[self presentViewController:nextVC animated:YES completion:nil];

その後、同じナビゲーション コントローラーにすべての VC が既にある場合は、このコードを使用して1 ステップ戻ることができます(たとえば、B から A へ、C から B へ)。

[self.navigationController popViewControllerAnimated:YES];

そして、このコードを使用して先頭にジャンプできます(例: C から A)。

[self.navigationController popToRootViewControllerAnimated:YES];


ケース 2 - 通常のサイクル (必要なもののように見えます)
これは簡単なケースですが、コードにはもっと注意する必要があります。親の親を取得して、現在のView Controllerを離れることができます

[[[self presentingViewController]presentingViewController]dismissViewControllerAnimated:NO 完了:nil];



注: モーダル プレゼンテーション関数でナビゲーション コントローラー関数を使用することはできません。Push は Pop で、Present は Dismiss で


UPDATE 1

モーダルセグエは、ネストされた接続(ツリーの1行)を作成しています。子(現在の)VC を閉じると、親 VC が正常に表示されます。親の親にジャンプしたい場合は、親を却下するだけで、その子 VC がすべて却下されます。popViewControllerAnimated が B から A に正常に動作する理由はわかりませんが、そのようにすることは許可されていません。モーダル セグエを使用している場合は、dismiss を使用してください。ポップは絶対に使わないでください。ポップはプッシュです。これを行うと、すべてが正常に機能するはずです。

B から A に戻るには、コードを次のように変更します。

[self dismissViewControllerAnimated:YES completion:nil];

C から A に戻るには、次のコードを使用します。

[[self parentViewController] dismissViewControllerAnimated:YES completion:nil];

また

[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];

更新 2

STORYBOARD セグエでは、このコードを使用して戻る必要があることを発見しました

[[[self presentingViewController] presentingViewController] dismissViewControllerAnimated:NO completion:nil];

このコードはC から Aに完全に細かくジャンプし、viewWillAppear呼び出されていますが、 A と B のviewWillAppear両方で呼び出されています

選択できるトラックは 3 つあります (実際には、デリゲートや通知の使用など、さらに多くのトラックがありますが、これは残念です)

  1. このバージョンに固執しますが、信頼性はありません。
  2. ストーリーボードを使用し続けますが、backCtoA ボタンを使用して VC C から A に接続するため、常にループしますが、毎回再度ロードされます。悪いけどまだ大丈夫。
  3. 最後に、適切な解決策は、Navigation Controllers に移動し (ところで、必要に応じて Nav Bar を非表示にできます)、VCs Stack を使用して popToViewController を簡単に使用できるようにすることです。
于 2015-10-22T10:33:38.457 に答える
-2

これはあなたのデザインでなければなりません:

コントローラー A -> Nav コントローラーへのモーダル セグエ (コントローラー B はルート ビュー コントローラー) -> コントローラー C へのプッシュ セグエ。

C から B に移動したい場合は、ポップを実行します。

B から A に、または C から A に行きたいときは、dismiss を行います。

于 2015-10-22T21:29:46.477 に答える