PresentViewController और नेविगेशन बार प्रदर्शित करता है


100

मेरे पास एक दृश्य नियंत्रक पदानुक्रम है और शीर्ष-सबसे नियंत्रक को एक मोडल के रूप में प्रदर्शित किया गया है और यह जानना चाहूंगा कि उपयोग करते समय नेविगेशन को कैसे प्रदर्शित किया जाए

'UIViewController:presentViewController:viewControllerToPresent:animated:completion'

डॉक्स के लिए 'presentViewController: एनिमेटेड: पूरा:' नोट:

'IPhone और iPod टच पर, प्रस्तुत दृश्य हमेशा पूर्ण स्क्रीन है। IPad पर, प्रस्तुति modalPresentationStyle गुण में मान पर निर्भर करती है। '

'ModalPresentationStyle' के लिए, डॉक्स कहते हैं:

प्रस्तुति शैली निर्धारित करती है कि एक मामूली प्रस्तुत दृश्य नियंत्रक ऑनस्क्रीन कैसे प्रदर्शित किया जाता है। IPhone और iPod टच पर, मोडल व्यू कंट्रोलर को हमेशा फुल-स्क्रीन प्रस्तुत किया जाता है, लेकिन iPad पर कई अलग-अलग प्रस्तुति विकल्प होते हैं।

क्या यह सुनिश्चित करने का कोई तरीका है कि दृश्य बार स्वयं प्रदर्शित होने के बाद नेविगेशन बार स्थिति बार के नीचे दिखाई देता है? क्या मुझे डॉक्टर के रूप में व्याख्या करनी चाहिए, आपको आईफोन / आईपॉड और केवल आईपैड पर कोई विकल्प नहीं मिलेगा?

पहले, मैं उपयोग कर रहा था 'UIViewController:presentModalViewController:animated'जो ठीक काम कर रहा था , लेकिन iOS 5.0 के बाद से, एपीआई को हटा दिया गया है इसलिए मैं नए पर स्विच कर रहा हूं।

नेत्रहीन, मैं जो करने की कोशिश कर रहा हूं, स्क्रीन के नीचे से नया नियंत्रक स्लाइड है, ठीक उसी तरह जैसे पुराने एपीआई करते थे।

[कोड के साथ अद्यतन करना]:

// My root level view:
UIViewController *vc = [[RootViewController alloc] 
                            initWithNibName:nil 
                            bundle:[NSBundle mainBundle]];
navController = [[UINavigationController alloc] initWithRootViewController:vc];        
....

// Within the RootViewController, Second view controller is created and added 
// to the hierarchy. It is this view controller that is responsible for 
// displaying the DetailView:
SecondTierViewController *t2controller = [[SecondTierViewController alloc] 
                                           initWithNibName:nil
                                           bundle:[NSBundle mainBundle]];

[self.navigationController pushViewController:t2controller animated:YES];

// Created by SecondTierViewController 
DetailViewController *controller = [[DetailViewController alloc] initWithNibName:nil                                                                                 
                                        bundle:[NSBundle mainBundle]];  

controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
controller.modalPresentationStyle = UIModalPresentationCurrentContext;

[self.navigationController presentViewController:controller 
                                        animated:YES 
                                        completion:nil];

जवाबों:


193

यह सच है कि यदि आप iPhone पर सामान्य रूप से कोई व्यू कंट्रोलर प्रस्तुत करते हैं, तो इसे हमेशा पूर्ण स्क्रीन पर प्रस्तुत किया जाएगा, भले ही आप इसे नेविगेशन नियंत्रक या किसी अन्य तरीके के शीर्ष दृश्य नियंत्रक पर कैसे प्रस्तुत करें। लेकिन आप हमेशा निम्न तरीके से नेविगेशन बार दिखा सकते हैं:

यह देखने के बजाय कि व्यू कंट्रोलर एक नेविगेशन कंट्रोलर को अपने रूट व्यू कंट्रोलर के साथ मामूली रूप से पेश करता है, जैसा कि आप चाहते हैं कि व्यू कंट्रोलर सेट करें:

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:nil bundle:nil];
UINavigationController *navigationController = 
    [[UINavigationController alloc] initWithRootViewController:myViewController];

//now present this navigation controller modally 
[self presentViewController:navigationController
                   animated:YES
                   completion:^{

                        }];

जब आपके विचार को मामूली रूप से प्रस्तुत किया जाता है तो आपको एक नेविगेशन बार देखना चाहिए।


यह बहुत सुंदर है जो मैंने शुरू किया था। लेकिन इसका कारण मैं 'presentModalViewController' का उपयोग नहीं कर रहा हूं क्योंकि यह एक अपग्रेड किए गए एपीआई के रूप में विख्यात है।
जोनास गार्डनर

यह वही है जो UIViewController वर्ग में लिखा गया है: // एक अन्य दृश्य नियंत्रक को एक मोडल बच्चे के रूप में प्रदर्शित करें। यदि अनुलंब शीट ट्रांस्फ़ॉर्म का उपयोग किया जाता है, तो एनिमेटेड। इस विधि को वर्तमान दृश्य द्वारा बदल दिया गया है: कंट्रोलर: एनिमेटेड: पूरा: // यह DEPRECATED होगा, तदनुसार योजना बनाएं। - (शून्य) presentModalViewController: (UIViewController *) modalViewController एनिमेटेड: (BOOL) एनिमेटेड; तो बस नई विधि को बुलाओ और पूरा होने के लिए निल पास करो और आपको अच्छा होना चाहिए।
मनीष आहूजा

बहुत बढ़िया जवाब। उपयोग करने के लिए अद्यतन(void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion
वेन

2
जब मैं नेविगेशन कंट्रोलर प्रस्तुत करने का प्रयास करता हूं, तो यह क्रैश हो जाता है ( 'NSInvalidArgumentException', reason: 'Pushing a navigation controller is not supported')। यह कैसे काम कर सकता है?
oarfish

मेरे मामले में यह बार दिखाता है लेकिन अन्य सामग्री को गलत तरीके से एनीमेशन पेश करने पर रखा गया है। और इस एनीमेशन के बाद ही यह सही स्थिति में कूदता है।
व्याचेस्लाव गेरिकोव

47

Swift 5.*

पथ प्रदर्शन:

guard let myVC = self.storyboard?.instantiateViewController(withIdentifier: "MyViewController") else { return }
let navController = UINavigationController(rootViewController: myVC)

self.navigationController?.present(navController, animated: true, completion: nil)

वापस जाना:

self.dismiss(animated: true, completion: nil)

स्विफ्ट 2.0

पथ प्रदर्शन:

let myVC = self.storyboard?.instantiateViewControllerWithIdentifier("MyViewController");
let navController = UINavigationController(rootViewController: myVC!)

self.navigationController?.presentViewController(navController, animated: true, completion: nil)

वापस जाना:

self.dismissViewControllerAnimated(true, completion: nil)

1
लेकिन कैसे सेट करने के लिए जब मैं आपके कोड की कोशिश करता हूं तब केवल नेविगेशन बार सेट करता हूं लेकिन मैं इसकी संपत्ति को बार टिंट रंग, शीर्षक आदि नहीं बदल सकता हूं
जयदीप

नहीं इस प्रश्न से संबंधित लेकिन आप यहां उत्तर मिल सकता है stackoverflow.com/questions/26008536/...
ताल सिय्योन

23

क्या आप उपयोग कर सकते हैं:

[self.navigationController pushViewController:controller animated:YES];

पीछे जाना (मुझे लगता है):

[self.navigationController popToRootViewControllerAnimated:YES];

3
धन्यवाद, इसे करने का सबसे अच्छा तरीका अगर आपके पास पहले से ही अपने स्टोरीबोर्ड में एक नेविगेशन नियंत्रक डिजाइन है। आपने मुझे बहुत मदद की
फ़ाइज़लिस

वापस जाना [self.navigationController popViewControllerAnimated: YES] है; popToRoot - 1 दृश्य कॉनक्रोलर पर वापस जाने के सभी रास्ते
बोरिस गफ्रोव

2

मुझे ios7 पर भी यही समस्या थी। मैंने इसे चयनकर्ता में बुलाया और यह ios7 और ios8 दोनों पर काम किया।

[self performSelector: @selector(showMainView) withObject: nil afterDelay: 0.0];

- (void) showMainView {
    HomeViewController * homeview = [
        [HomeViewController alloc] initWithNibName: @
        "HomeViewController"
        bundle: nil];
    UINavigationController * navcont = [
        [UINavigationController alloc] initWithRootViewController: homeview];
    navcont.navigationBar.tintColor = [UIColor whiteColor];
    navcont.navigationBar.barTintColor = App_Theme_Color;
    [navcont.navigationBar
    setTitleTextAttributes: @ {
        NSForegroundColorAttributeName: [UIColor whiteColor]
    }];
    navcont.modalPresentationStyle = UIModalPresentationFullScreen;
    navcont.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self.navigationController presentViewController: navcont animated: YES completion: ^ {

    }];
}

1

ऑल ए [self.navigationController pushViewController:controller animated:YES];डू एक ट्रांज़िशन है, और इसे नेविगेशन कंट्रोलर स्टैक और कुछ अन्य कूल नेविगेशन बार एनीमेशन स्टफ में जोड़ें। यदि आप बार एनीमेशन की परवाह नहीं करते हैं, तो यह कोड काम करना चाहिए । बार नए नियंत्रक पर दिखाई देता है, और आपको एक इंटरैक्टिव पॉप इशारा मिलता है!

//Make Controller
DetailViewController *controller = [[DetailViewController alloc] initWithNibName:nil                                                                                 
                                    bundle:[NSBundle mainBundle]];  
//Customize presentation
controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
controller.modalPresentationStyle = UIModalPresentationCurrentContext;

//Present controller
[self presentViewController:controller 
                   animated:YES 
                 completion:nil];
//Add to navigation Controller
[self navigationController].viewControllers = [[self navigationController].viewControllers arrayByAddingObject:controller];
//You can't just [[self navigationController].viewControllers addObject:controller] because viewControllers are for some reason not a mutable array.

संपादित करें: क्षमा करें, presentViewController पूर्ण स्क्रीन को भरेगा। आपको CGAffineTransform.translation या कुछ और के साथ एक कस्टम ट्रांज़िशन बनाने की आवश्यकता होगी, ट्रांज़िशन के साथ कंट्रोलर को चेतन करें, फिर इसे नेविगेशन कंट्रोलर के व्यू कॉन्ट्रोलर्स में जोड़ें।


1

स्विफ्ट 3

        let vc0 : ViewController1 = ViewController1()
        let vc2: NavigationController1 = NavigationController1(rootViewController: vc0)
        self.present(vc2, animated: true, completion: nil)

प्रस्तुत UIViewController पर BACK बटन कैसे जोड़ें
zulkarnain shah

1

स्विफ्ट संस्करण: यह एक ViewController प्रस्तुत करता है जो एक नेविगेशन नियंत्रक में एम्बेडेड है।

    override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    //  Identify the bundle by means of a class in that bundle.
    let storyboard = UIStoryboard(name: "Storyboard", bundle: NSBundle(forClass: SettingsViewController.self))

    // Instance of ViewController that is in the storyboard.
    let settingViewController = storyboard.instantiateViewControllerWithIdentifier("SettingsVC")

    let navController = UINavigationController(rootViewController: settingViewController)

    presentViewController(navController, animated: true, completion: nil)

}

1

मैं इस कोड का उपयोग करता हूं। यह iOS 8 में ठीक काम कर रहा है।

MyProfileEditViewController *myprofileEdit=[self.storyboard instantiateViewControllerWithIdentifier:@"myprofileeditSid"];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:myprofileEdit];
[self presentViewController:navigationController animated:YES completion:^{}];

0

एक हल

DetailViewController *controller = [[DetailViewController alloc] initWithNibName:nil                                                                                 
                                        bundle:[NSBundle mainBundle]];  

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
navController.modalPresentationStyle = UIModalPresentationCurrentContext;



[self.navigationController presentViewController:navController 
                                        animated:YES 
                                        completion:nil];

0

यदि आपने modalPresentationStyle गुण (UIModalPresentationFormSheet की तरह) सेट नहीं किया है, तो नेविगेशन बार हमेशा प्रदर्शित होगा। यह सुनिश्चित करने के लिए, हमेशा करते हैं

[[self.navigationController topViewController] presentViewController:vieController 
                                                            animated:YES 
                                                          completion:nil];

यह नेविगेशन बार को हमेशा दिखाएगा।


हम्म .. 'topViewController' के लिए निश्चित संदर्भ के साथ, मैं अभी भी एक ही व्यवहार देख रहा हूं। मुझे नहीं लगता कि मैं किसी भी विशेष तरीके से अन्य दृश्य नियंत्रकों को नौसेना स्टैक पर जोड़ रहा हूं।
जोनास गार्डनर

0

यदि आप Swift 2.x में NavigationController का उपयोग करते हैं

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let targetViewController = storyboard.instantiateViewControllerWithIdentifier("targetViewControllerID") as? TargetViewController
self.navigationController?.pushViewController(targetViewController!, animated: true)

0

इसे इस्तेमाल करे

     let transition: CATransition = CATransition()
    let timeFunc : CAMediaTimingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    transition.duration = 1
    transition.timingFunction = timeFunc
    transition.type = kCATransitionPush
    transition.subtype = kCATransitionFromRight
    self.view.window!.layer.addAnimation(transition, forKey: kCATransition)
    self.presentViewController(vc, animated:true, completion:nil)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.