26

के उप-दृश्य में एक बाल दृश्य नियंत्रक का दृश्य जोड़ें, मैं एक कंटेनर व्यू कंट्रोलर (नीचे दिखाया गया) के एक बच्चे दृश्य नियंत्रक के रूप में एक तालिका दृश्य नियंत्रक जोड़ना चाहता हूं। एप्पल के View Controller Programming Guide के अनुसार मैं अपने containerViewController अंदर कोड की निम्न लाइनों द्वारा इस लक्ष्य को हासिल कर सकते हैं:अभिभावक दृश्य नियंत्रक

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

वास्तव में, कि ठीक काम करता है। अब समस्या यह है कि मैं कंटेनर व्यू कंट्रोलर के रूट व्यू के सबव्यूव के रूप में tableViewController के दृश्य को जोड़ना नहीं चाहता हूं। इसके बजाय मैं इसे कंटेनर व्यू के एक सबव्यूव के रूप में जोड़ना चाहता हूं (छवि देखें) जो स्वयं कंटेनर व्यू कंट्रोलर के मूल दृश्य का सबव्यूव है।

[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:'

क्या समस्या यहाँ है इस प्रकार है तो मैं इसके बाद के संस्करण कोड बदल? क्या एक विशिष्ट उप अपने कंटेनर व्यू कंट्रोलर के दृश्य में कोई बच्चा दृश्य नियंत्रक का दृश्य जोड़ना संभव नहीं है? या दृश्य नियंत्रक पदानुक्रम में त्रुटि के बिना मैं इसे कैसे प्राप्त कर सकता हूं?

containerViewController

उत्तर

48

यह वास्तव में बात नहीं कौन-सा दृश्य बच्चे 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 का दृश्य जोड़ते हैं। – Mischa

+2

@ मिस्चा स्रोत कोड उत्तर में शामिल था। कृपया जांचें। TableViewController.view.frame = self.contentView.bounds के लिए – Anupdas

+4

+1; – 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]; 

} 

जोड़ें और ViewController, # childviewcontroller

1

को दूर एक main_view_controller पर एक child_view_controller दिखाने के लिए।

चरण 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]; 
} 
संबंधित मुद्दे