Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to load a NIB inside of a view in another NIB?

I have two NIB's

ParentViewController.xib
ChildViewController.xib

ParentViewController.xib contains a UIView and a UIViewController. ChildViewController.xib contains a UIButton

I want ChildViewController.xib to load in the ParentViewController.xib's UIView

I have done the following:

  1. Created @property for UIView in ParentViewController
  2. Connected File's Owner to UIView in ParentViewController
  3. Set UIViewController in ParentViewController's NIB Name property to ChildViewController in Interface Builder
  4. Set ChildViewController view property to UIView in ParentViewController

I was hoping this would load ChildViewController into my UIView in ParentViewController but no luck.

I did get the following warning, which could be the culprit:

'View Controller (Child View)' has both its 'NIB Name' property set and its 'view' outlet connected. This configuration is not supported.

I also have added additional code in ParentViewController's viewDidLoad():

- (void)viewDidLoad {
    [super viewDidLoad];
    ChildViewController *childViewController = [[ChildViewController alloc]initWithNibName:@"ChildViewController" bundle:nil]; 
    childViewController.view = self.myView; 
}

Any thoughts on why ChildViewController does not load in the UIView of ParentViewController?

like image 624
Sheehan Alam Avatar asked Apr 07 '10 02:04

Sheehan Alam


2 Answers

Try this

[self.myview addSubview: childViewController.view];

instead of

childViewController.view = self.myView; 
like image 139
Reena Avatar answered Sep 29 '22 10:09

Reena


The alternative is to build the "embedded" view (!) in a Nib, say ChildView.xib, then instantiate it in the ParentViewController.xib (change the class in the Identity inspector). There is no need to programmatically [self.view addSubview:embeddedView] in the parent view controller's -viewDidLoad method.

I wrote up how we embed custom-view Nibs inside other Nibs in a longish blog post. The crux is overriding -awakeAfterUsingCoder: in the ChildView class, replacing the object loaded from the "parent" Nib with the one loaded from the "child" Nib.

Note that our custom controls subclass UIView, not UIViewController (see Apple's docs on Custom view controllers: "You should not use multiple custom view controllers to manage different portions of the same view hierarchy.")

like image 20
Yang Meyer Avatar answered Sep 29 '22 08:09

Yang Meyer