26

tableViewControllerをcontainerViewControllerの子ビューコントローラとして追加したい(下記参照)。正常に動作している、実際には子ビューコントローラのビューを親ビューコントローラのサブビューに追加する

[self addChildViewController:tableViewController]; 
    [self.view addSubview:tableViewController.view]; 
    [tableViewController didMoveToParentViewController:self]; 

:AppleのView Controller Programming Guideによると、私は自分のcontainerViewController内のコードの次の行でこれを達成することができます。問題は、tableViewControllerのビューをcontainerViewControllerのルートビューのサブビューとして追加したくないということです。代わりに、containerViewControllerのルートビューのサブビューであるcontainerView(画像参照)のサブビューとして追加したいと思います。次のようにだから私は上記のコードを変更:私はそれがこのエラーですぐにクラッシュしたアプリ起動したときに

[self addChildViewController:tableViewController]; 
    [self.contentView addSubview:tableViewController.view]; 
    [tableViewController didMoveToParentViewController:self]; 

は今:

Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'child view controller: should have parent view controller: but actual parent is:'

をここでの問題は何ですか? childViewControllerのビューを特定のものに追加することはできませんサブ view of containerViewController?または、どのように私はビューコントローラ階層でエラーなしでこれを達成することができますか?

containerViewController

答えて

48

本当にあなたが子供のViewControllerを追加しているどのビュー問題ではありません。 viewControllerのビューが別のviewControllerに追加された場合は、適切に設定する必要があります。

tableViewController.view.frame = self.contentView.bounds; 
[self.contentView addSubview:tableViewController.view]; 
/*Calling the addChildViewController: method also calls 
the child’s willMoveToParentViewController: method automatically */ 
[self addChildViewController:tableViewController]; 
[tableViewController didMoveToParentViewController:self]; 

Source code

+0

あなたはそのことについて確認していて、そのコードをテストしていますか?私はそれを試みましたが、childViewControllerのビューをcontainerViewControllerのルートビューまたはそのサブビューのいずれかに追加するかどうかは違いがあります。 – Mischa

+2

@ミーシャ答えにソースコードが含まれています。チェックしてください。 – Anupdas

+4

+1 for tableViewController.view.frame = self.contentView.bounds; – onmyway133

1
//class name InfoViewController 

IBOutlet UIView *addViewToAddPlot; 
InfoViewController *InfoController; 

-(void) add_method 
{ 
    InfoController = [[InfoViewController alloc] initWithNibName:@"InfoViewController" bundle:nil]; 
    InfoController.view.frame = self.addViewToAddPlot.bounds; 

    [self containerAddChildViewController:InfoController]; 
} 

-(void) remove_method 
{ 
    [self containerRemoveChildViewController : InfoController]; 
} 

- (void)containerAddChildViewController:(UIViewController *)childViewController { 

    [self addChildViewController:childViewController]; 
    [self.addViewToAddPlot addSubview:childViewController.view]; 
    [childViewController didMoveToParentViewController:self]; 

} 

- (void)containerRemoveChildViewController:(UIViewController *)childViewController { 

    [childViewController willMoveToParentViewController:nil]; 
    [childViewController.view removeFromSuperview]; 
    [childViewController removeFromParentViewController]; 

} 

main_view_controllerオーバーchild_view_controllerを表示するには

1

を追加してのViewControllerを削除し、#1 childviewcontroller。

ステップ1:ストーリーボードにmain_view_controllerを作成します。

ステップ2:ストーリーボードに内のUIViewとchild_view_controllerといくつかのラベルを作成します。

ステップ3:main_view_controllerのボタン操作で次のコードを追加します。

- (IBAction)YourButtonAction:(id)sender { 
    ChildViewControllerName *childViewControllerName = [self.storyboard instantiateViewControllerWithIdentifier:@"storyboardIdYouProvided"]; 
    childViewControllerName.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height); 
    [self.view addSubview:childViewControllerName.view]; 
    [childViewControllerName didMoveToParentViewController:self]; 
} 
関連する問題