2

これが私のアプリの外観です。UINavigationController をサブクラス化して、ナビゲーション バーに似たボタンをタップすると MenuViewController がスライドするようにしました。VC1、VC2、VC3 の 1 つを UITableViewController メニュー内の didSelectRow から ContentViewController にプッシュ\表示するにはどうすればよいですか?

                -> SlidingViewController
                 / \
            コンテナコンテナ       
                | | | |
        MenuViewController ContentViewController
                | | | |
     UITableViewController サブクラス化された UINavigationController
                                  | | | | | | | |
                                 VC1 VC2 VC3 VC4

通常、次のコードのようなことを行いますが、上記の状況では、同じ UINavigationController にいない場合、新しいビュー コントローラーをプッシュする方法がわかりません。

NSString * storyboardName = @"MainStoryboard_iPhone";
NSString * viewControllerID = @"ViewID";
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
MyViewController * controller = (MyViewController *)[storyboard instantiateViewControllerWithIdentifier:viewControllerID];
[? presentViewController:controller animated:YES completion:nil];

編集:

機能する可能性のある解決策ですが、それが良い方法であるかどうかはわかりません。シングルトンを使用してナビゲーション コントローラーを保存し、後で使用しました。

私の ContentViewController 内:

[DataManager sharedDataManager].navController = self.navigationController;

MenuViewController の didSelectRow 内:

[[DataManager sharedDataManager].navController presentViewController:controller animated:YES completion:nil];
4

3 に答える 3

2

App Delegate (または編集に応じて、永続的なシングルトンはすべて機能します) で、View Controller インスタンスを保持するプロパティを作成します。

@property (nonatomic, strong) MenuViewController *menuViewController;

...など、すべてのVCについて。

後でそれらを初期化するときはいつでも、App デリゲートでこのプロパティを設定して VC を保持します。

MenuViewController *menuVC = [[MenuViewController alloc] init];

AppDelegate *appDel = [[UIApplication sharedApplication] delegate];
appDel.menuViewController = menuVC;

これで、提示する必要があるときにいつでもこのインスタンスを取得できます。メモリに保持したい menuViewController の任意のプロパティを設定することもできます。

注: 良き記憶市民であることを意識してください。didReceiveMemoryWarning メソッドを記述して、VC が再び表示されるようになったときに簡単にリロードできるものをすべて解放し、一度にメモリに保持しすぎることでアプリがクラッシュしないようにします。

于 2013-07-04T18:21:07.757 に答える
1

コンテナ構造を作成する 1 つのクラス (おそらくアプリ デリゲート) が必要です。作成されたView Controllerにアクセスできます。テーブル ビュー コントローラーとナビゲーション コントローラーの両方が最初に存在するわけではありませんが、最初にすべてを作成するクラスは、ナビゲーション コントローラーまたはコンテンツ ビュー コントローラーの参照をテーブル ビュー コントローラーまたはメニュー ビューに渡すことによって、構造間の「ブリッジを構築」する必要があります。コントローラ。その参照はプロパティに保存する必要があり、View Controller をきれいに表示できます。

parentViewControllerこの種のセットアップは、非透過的な方法で特定の構造に結び付けられるようになるため、または同様のリンクをナビゲートするよりも好ましい.


または、ストーリーボードにIBOutletプロパティを追加して、そこに直接接続することもできます (ストーリーボードのロード時にすべてのビュー コントローラーが事前に作成されている場合)。

于 2013-07-04T16:32:01.927 に答える