2

ユーザーがログインして登録できる HomeController があります。ユーザーがログインをクリックすると、セグエを使用してモーダル ビューが開きます。

モーダル ビュー内には、登録というボタンがあります。目的のアクションは、ログイン モーダル ビューを閉じてから、次を使用して登録モーダル ビューを開くことです。performSegueWithIdentifier:

- (void)loginControllerDidRegister:(LoginController *)controller sender:(id)sender
{
    NSLog(@"loginControllerDidRegister");
    [self dismissViewControllerAnimated:YES completion:nil];
    [self performSegueWithIdentifier:@"RegistrationSegue" sender:sender];
}

これにより、モーダル ビューが正しく閉じられ、performSegueWithIdentifier:が呼び出されます。ここで、登録ボタンを押したかのように呼び出されていることを示すログ コードがあります。

ログイン モーダル ビューが消えるアニメーションが、2 つ目のモーダル ビューの表示に干渉している可能性があると思います。これを修正するために何ができるかについてのアイデアはありますか?

4

3 に答える 3

2

「2番目のモーダル」VCを開始する必要があります。これが「prepareForSegue:」メソッドの機能です。また、「perform:」メソッドをオーバーライドする必要があります。これはあなたが思っているよりも少し複雑になるでしょう。これが役立つ場合は、セグエがどのように機能するかの内訳です...

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;

呼び出されて「セグエ」で渡されます。舞台裏

- (id)initWithIdentifier:(NSString *)identifier source:(UIViewController *)source destination:(UIViewController *)source;

が呼び出され、ここで「セグエ」が作成されます。

「セグエ」オブジェクトには次のプロパティがあります

(NSString *)identifier
(UIViewController *)sourceViewController
(UIViewController *)destinationViewController

これらがないと、セグエを実行できません。これらは、View Controller を手動で割り当てるのと似ています

SomeViewController *secondView = [SomeViewController alloc] initwithNibName:@"SomeViewController" bundle:nil];

それから

[[segue destinationViewController] setModalTransitionStyle:UIModalTransitionStyle(...)];

それは...

secondView.modalTransitionStyle = UIModalTransitionStyle(...);

(...) は、ストーリーボードで選択された「セグエ」トランジションになります。

最後に

[[segue sourceViewController] presentModalViewController:destinationViewController animated:YES];

それはちょうどです

[self presentModelViewController:secondView animated:YES];

それがすべて実現するものです。基本的に、必要なものを機能させるには、内部で行っているものを微調整する必要がありますが、それは実行可能です.

于 2012-05-04T21:40:43.360 に答える
0

2 番目のモーダル ビュー コントローラーの performSegue を、dismissViewControllerAnimated 呼び出しの完了ブロックに配置する必要があります。UINavigationController は、まだ他のモーダル ビュー コントローラーを表示している場合、表示を処理できません。

于 2014-06-02T09:22:10.007 に答える
0

誰かが同じ質問をしている場合。

- (void)loginControllerDidRegister:(LoginController *)controller sender:(id)sender
{
    NSLog(@"loginControllerDidRegister");
    [self dismissViewControllerAnimated:YES completion:^{
        [self performSegueWithIdentifier:@"RegistrationSegue" sender:sender];
    }];  
}
于 2014-08-27T14:34:50.597 に答える