1

うわー、私は大きな疑問を投げかけました!ストーリーボードのサブビュー(別のView Controller)内のボタンから新しいView Controllerをプッシュするには

私は別のビューコントローラ(メインVC)内で "ContentView"と呼ばれるビューコントローラを持っています。メインVCには、ストーリーボードを使用して作成されたナビゲーションコントローラがあります。 contentViewは、Segmented Controlが持つオプションに応じて3つの異なるView Controller(vc1、vc2、vc3)をロードします。したがって、質問は次のようになります:サブビュー(vc2)の1つのボタンから、ユーザーがセグメント化されたコントロールからオプションを選択すると表示されるボタンから、新しいView Controllerをロードするにはどうすればよいですか?

  1. 私は私のストーリーボードに表示ビューコントローラ(VC2)を持っているが、ナビゲーションコントローラがメインVC上にあるため、明らかに私はVC2' ファイルの所有者に、ボタンにアクションを接続することはできません。

  2. は、私は次のコードでそれにアクセスしようとしました:

    AppDelegate *del = (AppDelegate *)[UIApplication sharedApplication].delegate; 
    UINavigationController *navigationController =  (UINavigationController*)del.window.rootViewController; 
    DetalleMisMarcas *detalleMarcas = [[DetalleMisMarcas alloc] initWithNibName:@"DetalleMarcas" bundle:nil]; 
    
    [navigationController pushViewController:detalleMarcas animated:YES]; 
    

しかし、それは動作しません。

私はこのフォーラムから解決策を見つけようとしましたが、私は運がなかった。ほとんどの場合、Xcode 4.2にはないメインウィンドウの存在が考えられます。

最後に、私は3つのサブビューをロードする方法は、ここにある:

-(IBAction)segmentCtrlChanged:(id)sender { 
UISegmentedControl *seg = sender; 
if (seg.selectedSegmentIndex == 0) 
{ 

    MMViewController *mm= [self.storyboard instantiateViewControllerWithIdentifier:@"MMView"]; 
    mm.view.frame = CGRectMake(0, 0, 320, 240); 
    [contentView addSubview:mm.view]; 

} 

else if (seg.selectedSegmentIndex == 1) { 
    MPViewController *mp = [self.storyboard instantiateViewControllerWithIdentifier:@"MPView"]; 
    mp.view.frame = CGRectMake(0, 0, 320, 240); 
    [contentView addSubview:mp.view]; 

    } 
} 

-(IBAction)mainSubView:(id)sender 
{ 
MMViewController *mm = [[MMViewController alloc] initWithNibName:@"MTView" bundle:nil]; 
[contentView addSubview:theMTView]; 
mm.view.frame = CGRectMake(0, 0, 320, 240); 

} 

任意のアイデア?

答えて

0

編集:あなたのコメントに基づいて、私は代理人がうまくいくと思います。これを実装する方法です。 のはcontentViewコントローラクラスで言ってみましょう、代理人を追加

// in the header file 
@property (weak, nonatomic) id <ContentViewControllerDelegate> delegate; 
@protocol ContentViewControllerDelegate <NSObject> 
- (void)contentViewDidSelectAView:(UIView *)view; 
@end 

// in the implementation 
- (IBAction)segmentCtrlChanged:(UISegmentedControl *)sender { 
case 0: 
    [self.delegate contentViewDidSelectAView:[[self.storyboard instantiateViewControllerWithIdentifier:@"MMView"] view]; 
    break; 
// and the rest of the code 
} 

// in MainView header file 
@interface MainViewController : UIViewController <ContentViewControllerDelegate> 

// in MainView implementation 
- (void)contentViewDidSelectAView:(UIView *)view { 
[self.view addSubView:view]; 
} 

私は実際に上記のコードを実装していません。しかし、私はこれがコントローラーが親に話す方法でなければならないと思う。これが役立つことを願っています。


私は、あなたがやっている正確に何かわからないけど、あなたがルートにUINavigationControllerを持っている、とmainViewControllerが関係としてセグエを介して連結されているとしましょう。あなたが実装したように、mainVCのsegmentedControlは-(IBAction)segmentCtrlChanged:(id)sendervalueChangeイベントでリンクする必要があります。この方法では 彼らは同じ仕事、そしてあなたもidの代わりにUISegmentedControl *を使用することができますが、あなたが、むしろあれば使用するよりも、インデックスを切り替えることができます

-(IBAction)segmentCtrlChanged:(UISegmentedControl *)sender { 
switch(sender.selectedSegmentIndex) { 
case 0: { 
     MMViewController *mm= [self.storyboard instantiateViewControllerWithIdentifier:@"MMView"]; 
     [self.navigationController pushViewController:mm animated:YES]; 
     break; 
     } 

case 1: { 
     MPViewController *mp = [self.storyboard instantiateViewControllerWithIdentifier:@"MPView"]; 
     [self.navigationController pushViewController:mp animated:YES]; 
     break; 
    } 
case 2: { 
     // similar to above 
     break; 
    } 
default: 
    break; 

} 

VC1、VC2とVC3を、 - 私は仮定 - UIViewControllerのインスタンスです。そのクラスがリンクされていて、その識別子が適切に設定されていることを確認してください。それから彼らをそのまま残しておきなさい。なぜなら、あなたは彼らのために個々のセグを作るつもりはないからです。それらはコードを介してスタックにプッシュされます。

希望します。

+0

ありがとうございますが、コンテンツコントローラー(vc1、vc2、vc3)をcontentViewという別のビューから読み込むのに問題はありません。 contentViewはメインビューからすべてのビューを独自のV Cで占有せず、ビューの最下部のみを占有します。問題は、各ビューコントローラ(vc1、vc2、vc3)のコントロールが、メインビューのサブビューであるcontentView内にあることです。だから私がしたいのは、新しいビューコントローラをメインビューにプッシュすることですが、メインビュー内に別のビューコントローラ(vc1またはvc2またはvc3)を持つボタンから押します。 – naSh

+0

申し訳ありませんが、あなたが何をしようとしているのかがはっきりしていませんでした。その場合、デリゲートの作成、メインビューへの指示、サブビューへの追加について試してみましたか?それはうまくいくかもしれない。 – Canopus

関連する問題