9

मैं एक UIViewController इस कोड के साथ एक UINavigationController में निहित करने के लिए एक बच्चे को देखने के लिए नियंत्रक को जोड़ने के लिए कोशिश कर रहा हूँ करने के लिए बच्चे दृश्य नियंत्रक जोड़ें:UINavigationController

- (void)buttonTapped:(id)sender 
{ 
    MyChildController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MyChild"]; 
    [self addChildViewController:viewController]; 
    [self.view addSubview:viewController.view]; 
    [viewController didMoveToParentViewController:self]; 


    viewController.view.alpha = 0.0f; 
    [UIView animateWithDuration:0.4 animations:^{ 
     viewController.view.alpha = 1.0f; 
    }]; 
} 

लेकिन यह परिणाम है:

Image Result

जैसा कि आप UINavigatioBar देख सकते हैं और UIToolbar अभी भी बाल दृश्य नियंत्रक के शीर्ष पर हैं। मैं बच्चे के दृश्य नियंत्रक को सबसे ऊपर कैसे रख सकता हूं? मैं पहले से ही साथ कोड को बदलने के लिए कोशिश की है:

[self.navigationController addChildViewController:viewController]; 
    [self.navigationController.view addSubview:viewController.view]; 
    [viewController didMoveToParentViewController:self.navigationController]; 

लेकिन इस तरह से viewController की viewDidAppear:animated बुलाया नहीं प्राप्त करता है, यही कारण है कि पता नहीं।

उत्तर

5

अपना पहला दृश्य नियंत्रक में, कुछ इस तरह करते हैं:

- (IBAction)buttonClick:(id)sender 
{ 
    SecondViewController *secondView = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; 
    UIImage *blurryImage = [UIImage imageNamed:@"foo.jpeg"]; 
    secondView.imageView.image = blurryImage; 
    [self.navigationController addChildViewController:secondView]; 
    secondView.view.frame = self.navigationController.view.frame; 
    [self.navigationController.view addSubview:secondView.view]; 
} 

फिर अपने दूसरे दृश्य नियंत्रक में, अपने imageView के लिए गेटर जोड़ें:

-(UIImageView *)imageView 
{ 
    if(_imageView == nil) 
    { 
     _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 548)]; 
     [self.view addSubview:_imageView]; 
    } 
    return _imageView; 
} 
+0

मैं ViewController-कंटेनर दृष्टिकोण का उपयोग करने क्योंकि मैं मोडल दृश्य की पृष्ठभूमि के दृश्य को धुंधला करने की जरूरत है कोशिश कर रहा हूँ एक बच्चे जोड़े नियंत्रक जो अर्द्ध पारदर्शी भी है। प्रभाव अधिसूचना दृश्य जैसा ही है जो आप स्क्रीन के शीर्ष से नीचे खींचते हैं। पृष्ठभूमि अर्द्ध पारदर्शी है और यह धुंध/ठंडा ग्लास भी है। यदि मैं 'view.navigationController'' viewDidAppear' विधि को कोई बच्चा दृश्य नियंत्रक नहीं जोड़ता है तो क्यों नहीं कहा जाता है? –

+0

हम्म ... बिल्कुल यकीन नहीं है ... क्या आपने कॉल करने की कोशिश की है [viewController viewWillAppear: NO]? – JonahGabriel

+1

हां और यह कुछ भी नहीं करता है। मुझे लाइन के ठीक बाद '[व्यू कंट्रोलर व्यूडिडएपियर: नहीं]' कॉल करने की आवश्यकता है '[व्यू कंट्रोलर किया गया हैमोवेटेंटव्यू कंट्रोलर: self.navigationController] '। क्यों नहरों को बुलाया जाता है? अन्यथा यदि मैं बाल दृश्य नियंत्रक को 'स्वयं' में जोड़ता हूं और नहीं 'self.navigationController' यह काम करता है लेकिन उपर्युक्त छवि में दिखाया गया है कि दृश्य' नेविगेशन नियंत्रक 'के अंदर' अंदर 'है। –

28

@Sam की टिप्पणी सही है। आपको ट्रिगर होने के लिए viewDidAppear के लिए beginApperanceTransition:animated: और endAppearanceTransition पर कॉल करने की आवश्यकता है। UINavigationControllerviewDidAppear पर कॉल नहीं करता है जब आप एक बच्चे दृश्य नियंत्रक जोड़ते हैं क्योंकि यह प्रोग्रामर को अजीब स्थानों में बाल दृश्य नियंत्रक जोड़ने से रोकने के लिए इसके कंटेनर संरचना विधियों को ओवरराइड कर दिया गया है। आपके मामले में, यह नहीं चाहता कि आपका बच्चा नेविगेशन बार को कवर करने के लिए देखें। नेविगेशन नियंत्रक का सही उपयोग बच्चों को नेविगेशन बार के अंतर्गत दिखाना है। फिर भी, जब भी यह दिखाई दे रहा है और जब यह समाप्त हो गया है तो आप बच्चे को मैन्युअल रूप से बताकर इस गैर-मानक UI पर बल दे सकते हैं।

UINavigationController करने

MyChildViewController* child = [[MyChildViewController alloc] init]; 
[self.navigationController addChildViewController:child]; 
child.view.frame = self.navigationController.view.bounds; 
[self.navigationController.view addSubview:child.view]; 
child.view.alpha = 0.0; 
[child beginAppearanceTransition:YES animated:YES]; 
[UIView 
    animateWithDuration:0.3 
    delay:0.0 
    options:UIViewAnimationOptionCurveEaseOut 
    animations:^(void){ 
     child.view.alpha = 1.0; 
    } 
    completion:^(BOOL finished) { 
     [child endAppearanceTransition]; 
     [child didMoveToParentViewController:self.navigationController]; 
    } 
]; 

UINavigationController

से एक बच्चे को निकालें
[child willMoveToParentViewController:nil]; 
[child beginAppearanceTransition:NO animated:YES]; 
[UIView 
    animateWithDuration:0.3 
    delay:0.0 
    options:UIViewAnimationOptionCurveEaseOut 
    animations:^(void){ 
     child.view.alpha = 0.0; 
    } 
    completion:^(BOOL finished) { 
     [child endAppearanceTransition]; 
     [child.view removeFromSuperview]; 
     [child removeFromParentViewController]; 
    } 
]; 
+1

मुझे लगता है कि बच्चा 'didMoveToParentViewController' को कॉल कर रहा है: जब इसे हटाया जा रहा है .. कुछ ऐसा है, '[बच्चे ने किया थामोवेंटिव्यू कंट्रोलर: शून्य] ' –

+0

इससे मेरी मदद की ... धन्यवाद। ऊपर उठाया Pwner दिया। – Femina

+0

बहुत उपयोगी, धन्यवाद! – kernix

संबंधित मुद्दे