0

私は次のセットアップを持っています

http://i.minus.com/j6rhBqXOkRRjl.png

いずれかのボタンに触れると、それぞれの targetViewController のコンテンツがボタンの下の白いボックスに表示されます。

これは正常に動作しますが (以下のコードを参照)、ParentViewController を Navigation Controller で囲むとすぐに、ViewController は ParentViewController のビューのボックスに追加するのではなく、「First」ラベルを使用して View にプッシュします。

両方のセグエが「カスタム」として定義されているのに、プッシュが発生するのはなぜですか?

これは、ViewControllers を表示するための私のコードです。

-(void)swapVC:(UIViewController *)newController{

    if(_currentViewController){
        [_currentViewController removeFromParentViewController];
    }

    [self addChildViewController:newController];
    [self.contentView addSubview:newController.view];

    [newController didMoveToParentViewController:self];    
}


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

    if([segue.identifier isEqualToString:@"showFirst"]){

        [self swapVC:segue.destinationViewController];
    } else if([segue.identifier isEqualToString:@"showSecond"]){
        [self swapVC:segue.destinationViewController];        
    }

}
4

2 に答える 2

2

セグエは使用しないでください。transitionFromViewController:toViewController:duration:options:animation:completionビューコントローラを切り替える場合にこの方法を使用します。おそらくカスタムセグエが定義されていないため、セグエは単にビューコントローラをスタックにプッシュします。

編集:そこにセグエを残すことができますが、それらを実行すると、スタックにプッシュされます。

于 2012-07-20T16:22:59.150 に答える
1

アップルのソリューション

UITabBarControllerNavigation Controller の代わりに aを使用します。この機能が組み込まれています!

それがオプションでない場合は、以下の内容を読み続けてください...

ナビゲーション コントローラーとその使用時期について

ナビゲーション コントローラーはビュー コントローラーのスタック (先入れ先出し) を維持し、ビュー コントローラーをスタックの一番上に表示します。ビューコントローラーをスタックに「プッシュ」および「ポップ」するセグエを使用して、このスタックからビューコントローラーを追加および削除します。これは、一般的な情報を表示する UITableView や、UITableView で選択された項目に関する詳細情報を表示する UIViewController など、明確な画面フロー階層がある場合に最適です。UITableView は、この例の詳細なビューコントローラーに明確に導きます。

可能な限り、Apple のナビゲーション コントローラとタブバー コントローラを使用するようにしてください。それらは便利でよくできています。ただし、これらがうまくいかない場合は、遷移を自分で処理する必要があります...

あなたの場合、明確なビューフロー階層がないようです(親ビューは変更可能なビューを保持していますが、親ビューは最初と2番目の子ビューの「前」または「後」ではありません)。移行を開始しましょう。


シンプルなソリューション

したがって、ビューを変更する必要がありますが、ビューをスタックにプッシュする (より正確には、これらのビューを持つビューコントローラーをプッシュする) ナビゲーションコントローラーを使用することはありません。ナビゲーションコントローラーを使用していない場合は、ストーリーボードのセグエとコードのセグエメソッドを取り除きます(親ビューコントローラーもルートビューにします。これを行うには、ソトリボードに移動し、親ビューコントローラーを選択し、ユーティリティを使用しますツールバーで「is Initial View Controller」というラベルの付いたボックスをオンにします。問題が発生する場合は、ビューではなくビューコントローラーが選択されていることを確認してください)。最も簡単なアプローチは、次を使用することです。

transitionFromViewController:toViewController:duration:options:animations:completion:

ストーリーボードからコントローラーをインスタンス化する

次のように、親View Controllerで2つの子View Controllerをインスタンス化することにより、「最初」と「2番目」のViewControllerを取得できます。

firstVC = [self.storyboard instantiateViewControllerWithIdentifier:firstIdentifier];
secondVC = [self.storyboard instantiateViewControllerWithIdentifier:secondIdentifier];

どこfirstIdentifiersecondIdentifierはストーリーボードで定義されています。(ストーリーボードでビューコントローラーを選択し、ユーティリティツールバーの上部にある属性インスペクタータブに移動します。タブはシールド/ホームプレートのように見えます。属性インスペクターの対応するテキストフィールドで識別子を定義します。実際のコードでは、識別子はNSString* 例 @"My View Controller")

于 2012-07-20T18:26:50.957 に答える