web-dev-qa-db-ja.com

子View Controllerのビューを親View Controllerのサブビューに追加します

ContainerViewControllerの子View ControllerとしてtableViewControllerを追加したい(以下を参照)。 Appleの View Controllerプログラミングガイド によると、これはcontainerViewController内の次のコード行で実現できます。

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

実際、それはうまく機能します。問題は、tableViewControllerのビューをcontainerViewControllerのルートビューのサブビューとして追加したくないことです。代わりに、containerViewControllerのルートビューのサブビューであるcontainerViewのサブビューとして追加します(画像を参照)。そこで、上記のコードを次のように変更しました。

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

アプリを起動すると、このエラーですぐにクラッシュします:

キャッチされない例外 'UIViewControllerHierarchyInconsistency'によるアプリの終了、理由: '子View Controller:親View Controller:が必要ですが、実際の親は:'

ここで問題は何ですか? childViewControllerのビューをcontainerViewControllerの特定のsubビューに追加することはできませんか?または、View Controller階層でエラーなしでこれを達成するにはどうすればよいですか?

containerViewController

28
Mischa

子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];

ソースコード

48
Anupdas

main_view_controllerの上にchild_view_controllerを表示するには

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

ステップ2:ストーリーボードでIviewと内部のラベルでchild_view_controllerを作成します。

手順: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];
}
1
Ram Madhavan
//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];

}

Viewcontroller、#childviewcontrollerを追加および削除します

1
Manjeet