0

HomeView と HomeDropDownView があります。

HomeDropDownView は、HomeView のドロップダウン ビューとして表示されます。

HomeView は HomeDropDownView のデリゲートです。

HomeDropDownView でアクションを実行するときに、HomeView でデリゲート メソッドを呼び出し、そのデリゲート メソッドに 3 番目のビュー コントローラーである TestViewController をナビゲーション コントローラーから提示させたいと考えています。

クラスのどこからでも TestViewController を起動しようとすると、デリゲート メソッドを除いて正常に動作します。

HomeDropDownView にはアニメーションがありますが、コンプリートにデリゲート メソッドの呼び出しを配置し​​ても、View Controller は表示されません。そして、私がこれを使用している場合、アニメーションはとにかく起動しません。アニメーションなしのサイズ変更のみです。

TestViewController の init は viewDidLoad と同様に呼び出されますが、viewWillAppear は呼び出されず、ビューは表示されません。

コード:

ホームドロップダウンビュー

- (void)finalAction {
    ...
    [self callDelegateAction];
    ...

- (void)calldelegateAction {
    if ([self.delegate respondsToSelector:@selector(launchTestView)] ) {
        [self.delegate launchTestView];
    } else {
        DLog(@"Error out to the user.");
    }
}

ホームビュー

- (void)launchTestView {
        //[self listSubviewsOfView:self.parentViewController.view];

        NSLog(@"delegate method | self: %@", self);

        TestViewController *tvc = [[TestViewController alloc] initWithNibName:@"TestViewController" bundle:nil];
        //[self.navigationController presentViewController:tvc animated:YES completion:nil];
        //[self.view.window.rootViewController presentViewController:tvc animated:YES completion:nil];
        //[self.navigationController pushViewController:tvc animated:YES];
        AppDelegate *appdelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
        [appdelegate.tabBarController.navigationController presentViewController:tvc animated:YES completion:^() {
            NSLog(@"Done!");
        }];
}

上記のアプローチはどれも機能しません。しかし、まったく同じコードを viewDidAppear に入れるか、ボタン アクション メソッドに入れると、問題なく動作します。デリゲート メソッドの自己を呼び出す時点で HomeView があり、nav コントローラーを含むすべてのサブビューがそこにあるように見えます。これは tabcontroller ベースのプロジェクトにありますが、上記のいずれも nav コントローラーを呼び出す方法として受け入れられると思います。

私は何が欠けていますか?デリゲート メソッドが HomeView の Nav コントローラーでビューコントローラーをプッシュ/提示したくないのはなぜですか? おそらく私が見逃しているものですが、Apple Docsやその他のスレッドで理由を見つけることができません. 助けてくれてありがとう!

4

1 に答える 1

0

悲しいことに、メッセージの実行中に HomeView が変更されていたことが判明しました。そのため、HomeView がメッセージ呼び出しを受け取るまでに、最初にアクションを要求したのと同じ HomeView オブジェクトではなくなりました。したがって、それは同じデリゲートではありませんでした。これは、同じビューが別の目的で使用されているようにユーザーに見せるためです。しかし、これは、重要なビューを破棄して再作成してはならない理由の良い例です。メッセージを送信することがわかっている場合は、代わりに同じビューを使用してオブジェクトをリロードする必要がありました。または、制御構造の概念がありました。

于 2013-10-17T12:05:35.790 に答える