2

MainViewController、CurledViewController、および SecondayViewController の 3 つの UIViewController があります。

MainViewController には、次の方法で CurledViewController を表示する MainViewController に 1 つの UIButton があります。

curled = [[CurledViewController alloc] init];
[curled setModalTransitionStyle:UIModalTransitionStylePartialCurl];
[self presentModalViewController:curled animated:YES];

ドキュメントから、次のように言われました:

このトランジションを使用して表示されるモーダル ビュー自体は、追加のモーダル ビューを表示できません。

CurledViewController がこのように表示されている場合、SecondaryViewController を開くことができません。私がやりたいのは、CurledViewController で UIButton を選択したときに、カールを閉じて、SecondaryViewController を開くことです (CurledViewController または MainViewController からの呼び出しであるかどうかは関係ありません)。SecondaryViewController を閉じたら、CurledViewController を再度開きたいと思います。

CurledViewController の UIButton にアタッチされた関数で、次の方法でこれを試みました。

- (void)showSecondary:(UIButton *)sender {
   [self.parentViewController dismissModalViewControllerAnimated:YES];
   SecondaryViewController *secondaryView = [[SecondaryViewController alloc] initWithNibName:@"Secondary" bundle:Nil];
   [self presentModalViewController:secondaryView animated:YES];
   ...
}

それでも言われますが、

Application tried to present a nested modal view controller while curled

この方法で新しい UIViewController を開くにはどうすればよいですか?

ありがとう!

4

1 に答える 1

1

ここでの問題は、SecondaryViewController を提示するためのコードがまだ CurledViewController から実行されていることです。試行する別の方法の 1 つは、CurledViewControllerDelegate プロトコルを作成することです。MainViewController を CurledViewController のデリゲートにして、showSecondary からデリゲート メソッドを呼び出します。

CurledViewController では、メソッドは次のようになります。

- (void)showSecondary:(UIButton *)sender {
    [self.delegate dismissCurledViewController:self];
}

MainViewController では、デリゲート メソッドは次のようになります。

- (void)dismissCurledViewController:(CurledViewController *)controller {
    [self dismissModalViewControllerAnimated:NO];
    SecondaryViewController *secondaryView = [[SecondaryViewController alloc] initWithNibName:@"Secondary" bundle:nil];
    [self presentModalViewController:secondaryView animated:YES];
    …
}

編集

新しいモーダル ビュー コントローラーの終了と表示の両方でアニメーションを維持するには、最初のアニメーションが完了するのに十分な時間を確保するための遅延を導入する必要があります。performSelector:withObject:afterDelay:これを行うには、適切な遅延値を指定して呼び出します。ただし、これは最初のアニメーションの継続時間が常に同じであると想定しているため、エラーが発生しやすいアプローチです。

Andrew Pouliot が別の質問で示唆したように、MainViewController でオーバーライドして、SecondaryViewController を表示する必要があるかどうかを判断するフラグを探すこともできますviewDidAppear:。これは、前述のデリゲート アプローチを引き続き使用しますが、MainViewController には次の違いがあります。

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

    if(showSecondaryViewController) {
        SecondaryViewController *secondaryView = [[SecondaryViewController alloc] initWithNibName:@"Secondary" bundle:nil];
        [self presentModalViewController:secondaryView animated:YES];
    }

    showSecondaryViewController = NO;
}

- (void)dismissCurledViewController:(CurledViewController *)controller {
    showSecondaryViewController = YES;  
    [self dismissModalViewController:YES];
}
于 2011-08-11T18:49:44.087 に答える