झपट्टा और स्विफ्ट में एक दृश्य कंट्रोलर पेश करें


299

मुद्दा

मैंने नए Swiftपर एक नज़र रखना शुरू कर दिया Xcode 6, और मैंने कुछ डेमो प्रोजेक्ट और ट्यूटोरियल की कोशिश की। अब मैं यहाँ पर हूँ:

त्वरित करना और फिर viewControllerएक विशिष्ट स्टोरीबोर्ड से प्रस्तुत करना

उद्देश्य-सी समाधान

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"myStoryboardName" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"myVCID"];
[self presentViewController:vc animated:YES completion:nil];

स्विफ्ट पर यह कैसे प्राप्त करें?

जवाबों:


647

यह उत्तर अंतिम बार स्विफ्ट 5.2 और आईओएस 13.4 एसडीके के लिए संशोधित किया गया था।


यह सब नए वाक्यविन्यास और थोड़ा संशोधित एपीआई की बात है। UIKit की अंतर्निहित कार्यक्षमता नहीं बदली है। यह आईओएस एसडीके फ्रेमवर्क के विशाल बहुमत के लिए सच है।

let storyboard = UIStoryboard(name: "myStoryboardName", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "myVCID")
self.present(vc, animated: true)

यदि आपको समस्या हो रही है init(coder:), तो कृपया EridB के उत्तर को देखें ।


3
आप भी छोड़ सकते हैं ;! ;) क्या आप इस बारे में विस्तार से बताएंगे as UIViewController? ऐसा क्यों जरूरी है?
सेबेस्टियन रेम्बा

5
asकीवर्ड का उपयोग टाइपकास्टिंग के लिए किया जाता है। यह (UIViewController *)anObject
वस्तु के

1
हाँ, मुझे पता है कि मैं उन्हें छोड़ सकता हूँ लेकिन यह लंबे समय तक रहने का एक हिस्सा है। : डी के रूप में instantiateViewControllerWithIdentifierरिटर्न AnyObject( idस्विफ्ट के बराबर) और मैं घोषित vcकरता UIViewControllerहूं, मुझे टाइपकास्ट AnyObjectकरना है UIViewController
आकाशवाणी

हाय फ्रेंड्स, मैं कुछ अलग मुद्दे का सामना कर रहा हूं, यह कोड मेरे आईपैड 2 पर नहीं बल्कि आईओएस v7.1.2 पर सिम्युलेटर पर चलता है। यदि आप इस मुद्दे को हल करने में मेरी मदद नहीं करते हैं।
इंद्र

3
@akashivskyy सबसे निश्चित रूप से, आपको। लेकिन शायद कुछ को नहीं।
एमएमसी

43

इस्तेमाल करने वाले लोगों के लिए @ akashivskyy के जवाब इन्स्तांत करने के लिए UIViewControllerऔर अपवाद हो रही है:

घातक त्रुटि: वर्ग के लिए अकल्पित इनिशियलाइज़र 'इनिट (कोडर :)') का उपयोग

जल्द सलाह:

required init?(coder aDecoder: NSCoder)अपने गंतव्य पर मैन्युअल रूप से लागू करें UIViewControllerजिसे आप तुरंत करने की कोशिश कर रहे हैं

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

यदि आपको अधिक विवरण की आवश्यकता है तो कृपया यहाँ मेरे उत्तर का संदर्भ लें


यदि आप कस्टम आरंभकर्ता का उपयोग करना चाहते हैं, तो आप सुपर को सुपर.इनट (nibName: nil, बंडल: nil) के साथ कॉल कर सकते हैं और घरघराहट को ठीक से लोड करेंगे या उन्हें NIB फ़ाइल के नाम से कॉल करेंगे।
user1700737

4
@ user1700737 मैं स्टोरीबोर्ड का जिक्र करते हुए व्यू-कंट्रौलर को इंस्टेंट कर रहा हूं, जो initWithCoder को निष्पादित करता है, initWithNib को नहीं। इस सवाल का संदर्भ लें stackoverflow.com/questions/24036393/…
E-Riddie

हाय फ्रेंड्स, मैं कुछ अलग मुद्दे का सामना कर रहा हूं, यह कोड मेरे आईपैड 2 पर नहीं बल्कि आईओएस v7.1.2 पर सिम्युलेटर पर चलता है। यदि आप इस मुद्दे को हल करने में मेरी मदद नहीं करते हैं।
इंद्र

@ और आपको स्टैक पर एक और सवाल पूछने की जरूरत है, मुझे लिंक दें बीमार आपकी मदद करने के लिए खुश रहें!
ई-रिद्दी

स्विफ्ट 1.2 पर आपको init(coder aDecoder: NSCoder!)"आवश्यक" बनाना होगा । तो अब आपको निम्नलिखित लिखना है:required init(coder aDecoder: NSCoder!)
एडुआर्डो वीगास

18

इस लिंक में दोनों कार्यान्वयन हैं:

स्विफ्ट:

let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController") as UIViewController
self.presentViewController(viewController, animated: false, completion: nil)

उद्देश्य सी

UIViewController *viewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"ViewController"];

इस लिंक में समान स्टोरीबोर्ड में व्यूकंट्रोलर आरंभ करने के लिए कोड है

/*
 Helper to Switch the View based on StoryBoard
 @param StoryBoard ID  as String
*/
func switchToViewController(identifier: String) {
    let viewController = self.storyboard?.instantiateViewControllerWithIdentifier(identifier) as! UIViewController
    self.navigationController?.setViewControllers([viewController], animated: false)

}

15

akashivskyy का जवाब ठीक काम करता है! लेकिन, यदि आपको प्रस्तुत दृश्य नियंत्रक से लौटने में कुछ परेशानी होती है, तो यह विकल्प मददगार हो सकता है। यह मेरे लिए काम किया!

स्विफ्ट:

let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("someViewController") as! UIViewController
// Alternative way to present the new view controller
self.navigationController?.showViewController(vc, sender: nil)

Obj सी:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboardName" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"someViewController"];
[self.navigationController showViewController:vc sender:nil];

12

स्विफ्ट 4.2 अपडेटेड कोड है

let storyboard = UIStoryboard(name: "StoryboardNameHere", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "ViewControllerNameHere")
self.present(controller, animated: true, completion: nil)

7
// "Main" is name of .storybord file "
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
// "MiniGameView" is the ID given to the ViewController in the interfacebuilder
// MiniGameViewController is the CLASS name of the ViewController.swift file acosiated to the ViewController
var setViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MiniGameView") as MiniGameViewController
var rootViewController = self.window!.rootViewController
rootViewController?.presentViewController(setViewController, animated: false, completion: nil)

यह मेरे लिए ठीक है जब मैंने इसे AppDelegate में रखा


7

यदि आप इसे सामान्य रूप से प्रस्तुत करना चाहते हैं, तो आपके पास बोलो की तरह कुछ होना चाहिए:

let vc = self.storyboard!.instantiateViewControllerWithIdentifier("YourViewControllerID")
self.showDetailViewController(vc as! YourViewControllerClassName, sender: self)

5

मैं एक बहुत क्लीनर तरीके का सुझाव देना चाहूंगा। यह उपयोगी होगा जब हमारे पास कई स्टोरीबोर्ड होंगे

1. अपने सभी स्टोरीबोर्ड के साथ एक संरचना बनाएं

struct Storyboard {
      static let main = "Main"
      static let login = "login"
      static let profile = "profile" 
      static let home = "home"
    }

2. इस तरह UIStoryboard एक्सटेंशन बनाएं

extension UIStoryboard {
  @nonobjc class var main: UIStoryboard {
    return UIStoryboard(name: Storyboard.main, bundle: nil)
  }
  @nonobjc class var journey: UIStoryboard {
    return UIStoryboard(name: Storyboard.login, bundle: nil)
  }
  @nonobjc class var quiz: UIStoryboard {
    return UIStoryboard(name: Storyboard.profile, bundle: nil)
  }
  @nonobjc class var home: UIStoryboard {
    return UIStoryboard(name: Storyboard.home, bundle: nil)
  }
}

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

let loginVc = UIStoryboard.login.instantiateViewController(withIdentifier: "\(LoginViewController.self)") as! LoginViewController

Whats @nonobjc के लिए?
स्टैकरनर

1
@StackRunner यह उद्देश्य c
XcodeNOOB

3

स्विफ्ट 4:

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let yourVC: YourVC = storyboard.instantiateViewController(withIdentifier: "YourVC") as! YourVC

2

यदि आपके पास कोई स्टोरीबोर्ड / Xib का उपयोग नहीं करने वाला व्यू-कॉन्ट्रोलर है, तो आप इस विशेष वीसी को नीचे दिए गए कॉल की तरह धकेल सकते हैं:

 let vcInstance : UIViewController   = yourViewController()
 self.present(vcInstance, animated: true, completion: nil)

मुझे यह मिलता है: "इसका निर्माण नहीं किया जा सकता क्योंकि इसमें कोई सुलभ आरंभीकरण नहीं है"।
पॉल बेनेटेउ

स्टोरीबोर्ड द्वारा किए गए आउटलेट और अन्य रिश्ते खो गए हैं
jose920405

2

स्विफ्ट 3 स्टोरीबोर्ड

let settingStoryboard : UIStoryboard = UIStoryboard(name: "SettingViewController", bundle: nil)
let settingVC = settingStoryboard.instantiateViewController(withIdentifier: "SettingViewController") as! SettingViewController
self.present(settingVC, animated: true, completion: {

})

1

मुझे पता है कि यह एक पुराना धागा है, लेकिन मुझे लगता है कि वर्तमान समाधान (दिए गए व्यू कंट्रोलर के लिए हार्डकोड स्ट्रिंग आइडेंटिफ़ायर का उपयोग करना) त्रुटियों से बहुत ग्रस्त है।

मैंने एक बिल्ड टाइम स्क्रिप्ट बनाई है (जिसे आप यहां एक्सेस कर सकते हैं ), जो दिए गए प्रोजेक्ट के भीतर सभी स्टोरीबोर्ड से व्यू कंट्रोलर्स को एक्सेस और इंस्टेंट करने के लिए एक कंपाइलर सुरक्षित रास्ता बनाएगा।

उदाहरण के लिए, दृश्य नियंत्रक नामित VC1 में Main.storyboard तो जैसे instantiated किया जाएगा:

let vc: UIViewController = R.storyboard.Main.vc1^  // where the '^' character initialize the controller

1

कोई फर्क नहीं पड़ता कि मैंने क्या कोशिश की, यह सिर्फ मेरे लिए काम नहीं करेगा - कोई त्रुटि नहीं, लेकिन मेरी स्क्रीन पर कोई नया दृश्य नियंत्रक भी नहीं। पता नहीं क्यों, लेकिन इसे टाइमआउट फ़ंक्शन में लपेटने से आखिरकार यह काम हो गया:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.0) {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "TabletViewController")
    self.present(controller, animated: true, completion: nil)
}


0

मैंने एक ऐसी लाइब्रेरी बनाई जो बेहतर सिंटैक्स के साथ इसे और अधिक आसान बनाएगी:

https://github.com/Jasperav/Storyboardable

बस Storyboard.swift बदलें और इसके ViewControllersअनुरूप होने दें Storyboardable

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.