स्विफ्ट प्रोग्रामेटिकली दूसरे व्यू कंट्रोलर / सीन पर नेविगेट करें


83

मैं निम्नलिखित कोड का उपयोग प्रोग्रामेटिक रूप से किसी अन्य ViewController पर नेविगेट करने के लिए कर रहा हूं। यह ठीक काम करता है, लेकिन यह कुछ कैसे छुपाता है navigation barमैं यह कैसे तय करुं? ( यदि वह मामले ViewControllerमें एम्बेड करके नेविगेशन बार बनाया गया navigation controllerहै।)

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("nextView") as NextViewController
self.presentViewController(nextViewController, animated:true, completion:nil)

जवाबों:


208

स्विफ्ट 5

डिफ़ॉल्ट मोडल प्रस्तुति शैली एक कार्ड है। यह शीर्ष पर पिछले दृश्य नियंत्रक को दिखाता है और उपयोगकर्ता को प्रस्तुत दृश्य नियंत्रक को दूर स्वाइप करने की अनुमति देता है।

पुरानी शैली को बनाए रखने के लिए आपको उस दृश्य नियंत्रक को संशोधित करना होगा जिसे आप इस तरह प्रस्तुत करेंगे:

newViewController.modalPresentationStyle = .fullScreen

यह प्रोग्रामेटिक रूप से निर्मित और स्टोरीबोर्ड निर्मित नियंत्रक दोनों के लिए समान है।

स्विफ्ट 3

एक प्रोग्रामेटिकली कंट्रोलर के साथ

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

let newViewController = NewViewController()
self.navigationController?.pushViewController(newViewController, animated: true)

StoryBoard के साथ नियंत्रक बनाया

यदि आप Identifier के साथ StoryBoard पर "newViewController" नेविगेट करना चाहते हैं, तो यह करें:

let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "newViewController") as! NewViewController
        self.present(newViewController, animated: true, completion: nil)

2
स्टोरीबोर्ड ऑप्शन में "as! NewViewController" की जरूरत नहीं है
Lavi Avigdor

2
मुझे पता है कि वैकल्पिक है, लेकिन अगर हम दिखाते हैं तो यह स्पष्ट हो जाता है कि कौन सा व्यू कॉन्ट्रैक्टर किसी अन्य डेवलपर के लिए गंतव्य है
jaiswal Rajan

4
कॉल करें storyBoard.instantiateViewControllerऔर self.presentमुख्य थ्रेड से, या आपको व्यू कॉन्ट्रोलर घटकों को प्रदर्शित करने में देरी होगी
एलेक्स

2
@ देखें, यह मुख्य धागे से कॉल करने के लिए डेवलपर तक है, मैंने अभी ऊपर पूछे गए प्रश्न का उत्तर लिखा है। मुख्य धागे से कॉल करने के लिए आपकी टिप्पणी यहाँ उचित नहीं है।
जायसवाल राजन

हाय peeps: एक सामान्य नियम के रूप में, क्या मैं एक मित्रतापूर्ण स्वर सुझा सकता हूं? (यह SO पर यहाँ काफी एक मुद्दा है) इस विषय के लिए: इसके बजाय, हालांकि यह सीधे ओपी द्वारा नहीं पूछा गया है, मुझे लगता है कि यह अच्छा जवाब अभी भी याद करने के लिए (पढ़ने वाले किसी भी व्यक्ति) के लिए एक उपयुक्त जगह है कि कार्रवाई मुख्य धागे पर होनी है
सुपरजोस

32

स्विफ्ट 4.x

डबल कोट्स में स्ट्रिंग्स हमेशा मुझे भ्रमित करती हैं, इसलिए मुझे लगता है कि इस प्रश्न का उत्तर इसे स्पष्ट करने के लिए कुछ चित्रमय प्रस्तुति की आवश्यकता है।

एक बैंकिंग ऐप के लिए, मेरे पास एक LoginViewController और एक BalanceViewController है। प्रत्येक की अपनी संबंधित स्क्रीन है।

ऐप शुरू होता है और लॉगिन स्क्रीन दिखाता है। जब लॉगिन सफल होता है, तो एप्लिकेशन शेष स्क्रीन खोलता है।

यहाँ है कि यह कैसा दिखता है:

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

लॉगिन सफलता इस तरह से नियंत्रित की जाती है:

let storyBoard: UIStoryboard = UIStoryboard(name: "Balance", bundle: nil)
let balanceViewController = storyBoard.instantiateViewController(withIdentifier: "balance") as! BalanceViewController
self.present(balanceViewController, animated: true, completion: nil)

जैसा कि आप देख सकते हैं, छोटे अक्षरों में स्टोरीबोर्ड आईडी 'बैलेंस' वह है जो कोड की दूसरी पंक्ति में जाता है, और यह वह आईडी है जिसे स्टोरीबोर्ड सेटिंग्स में परिभाषित किया गया है, जैसे संलग्न स्क्रीनशॉट में।

पूंजी 'बी' के साथ 'शेष' शब्द स्टोरीबोर्ड फ़ाइल का नाम है , जिसका उपयोग कोड की पहली पंक्ति में किया जाता है।

हम जानते हैं कि कोड में हार्ड कोडिंग स्ट्रिंग्स का उपयोग करना बहुत बुरा अभ्यास है, लेकिन किसी भी तरह से iOS के विकास में यह एक आम बात हो गई है, और Xcode उनके बारे में चेतावनी भी नहीं देता है।


जबरदस्त प्रदर्शन
एलियास फज़ल

1
यार तुम कमाल हो!
ओह्हहत वीरून

16

आपको वर्तमान नेविगेशन कंट्रोलर का उपयोग करके नए व्यू-कॉन्ट्रैक्टर को धक्का देना चाहिए, उपस्थित नहीं।

self.navigationController.pushViewController(nextViewController, animated: true)

हमें क्यों धक्का देना चाहिए कोई लाभ है?
ड्रैगनफायर

1
@DragonFire, क्योंकि op चाहता है कि यह नेविगेशन बार को कवर किए बिना काम करता है। अगर आप व्हाट्सएप कॉन्टैक्ट स्क्रीन और चैट स्क्रीन के बीच एक मास्टर-डिटेल पेज डिजाइन करना चाहते हैं, तो आपको pushअपने नेविगेशन कॉन्ट्रैक्टर के साथ व्यूकंट्रोलर चाहिए । (यह दाएं से बाएं चेतन होगा) यदि आप वर्तमान स्क्रीन पर दिखाना चाहते हैं, वर्तमान, पॉप-अप (जो नीचे से ऊपर तक चेतन होगा), बस उपयोग करें present
Okan Kocyigit

धन्यवाद! मेरे नेविगेशन कंट्रोलर टैब्स आदि को ध्यान में रखते हुए काम करता है
डेविड_2877

12

@ डिजिस्वाल राजन के अनुसार उनके जवाब । आप इस तरह से एक pushViewController कर सकते हैं:

let storyBoard: UIStoryboard = UIStoryboard(name: "NewBotStoryboard", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "NewViewController") as! NewViewController
self.navigationController?.pushViewController(newViewController, animated: true)

1
नमस्ते, बस सोच रहा था: पहले से ही पोस्ट किए गए उत्तर को क्यों दोहराएं? हो सकता है कि एक टिप्पणी या एक टिप्पणी भी ठीक रही होगी। या पीछे और भी कारण हैं?
सुपरजोस

वह नैविगेशनकंट्रोलर के साथ नेविगेट करने के लिए प्रस्तुत कर रहा है। धन्यवाद।
हिरण डीए वालवेज

4

इसलिए यदि आप एक दृश्य नियंत्रक प्रस्तुत करते हैं तो यह नेविगेशन नियंत्रक में नहीं दिखाई देगा। यह सिर्फ पूरी स्क्रीन लेगा। इस मामले के लिए आपको एक और नेविगेशन नियंत्रक बनाना होगा और अपने को जोड़ना होगाnextViewController रूट होगा और इस नए नेविगेशनकंट्रोलर को प्रस्तुत करना होगा।

दूसरा तरीका यह है कि केवल व्यू कंट्रोलर को पुश करें।

self.presentViewController(nextViewController, animated:true, completion:nil)

अधिक जानकारी के लिए Apple दस्तावेज़ीकरण देखें: - https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/doc/uid/TP40006926-CH3-SW96


presentViewControllerका नाम बदलकरpresent(loginController, animated:true, completion:nil)
kite_n_code

2
OperationQueue.main.addOperation {
   let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
   let newViewController = storyBoard.instantiateViewController(withIdentifier: "Storyboard ID") as! NewViewController
   self.present(newViewController, animated: true, completion: nil)
}

यह मेरे लिए काम करता है जब मैंने कोड को अंदर रखा OperationQueue.main.addOperation, जो मेरे लिए मुख्य थ्रेड में निष्पादित होगा।


1

उपरोक्त कोड अच्छी तरह से काम करता है, लेकिन यदि आप एक NSObjectवर्ग से नेविगेट करना चाहते हैं , जहां आप उपयोग नहीं कर सकते हैं self.present:

let storyBoard = UIStoryboard(name:"Main", bundle: nil)
if let conVC = storyBoard.instantiateViewController(withIdentifier: "SoundViewController") as? SoundViewController,
    let navController = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController {
    
    navController.pushViewController(conVC, animated: true)
}

0

अन्य सभी उत्तर अच्छे लगते हैं, मैं अपने मामले को कवर करना चाहूंगा, जहां मुझे एक एनिमेटेड लॉन्चस्क्रीन बनाना था, फिर 3 से 4 सेकंड के एनीमेशन के बाद अगला काम होम स्क्रीन पर ले जाना था। मैंने सेगमेंट की कोशिश की, लेकिन इससे गंतव्य को देखने में समस्या पैदा हुई। इसलिए अंत में मैंने AppDelegates की विंडो प्रॉपर्टी को एक्सेस किया और मैंने इसके लिए एक नया नेविगेशनकंट्रोलर स्क्रीन सौंपा।

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let homeVC = storyboard.instantiateViewController(withIdentifier: "HomePageViewController") as! HomePageViewController

//Below's navigationController is useful if u want NavigationController in the destination View
let navigationController = UINavigationController(rootViewController: homeVC)
appDelegate.window!.rootViewController = navigationController

यदि उकसाना है, तो आप गंतव्य दृश्य में नेवीगेशन कंट्रोलर नहीं चाहते हैं, तो बस के रूप में असाइन करें,

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let homeVC = storyboard.instantiateViewController(withIdentifier: "HomePageViewController") as! HomePageViewController
appDelegate.window!.rootViewController = homeVC
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.