मैं स्टोरीबोर्ड को प्रोग्रामिक रूप से कक्षा से कैसे लोड कर सकता हूं?


183

मेरी समस्या यह है कि मैं स्टोरीबोर्ड और xib दोनों का उपयोग करने के तरीके की तलाश कर रहा था । लेकिन मुझे स्टोरीबोर्ड को प्रोग्रामेटिक रूप से लोड करने और दिखाने का उचित तरीका नहीं मिल रहा है। प्रोजेक्ट को xib के साथ विकसित करना शुरू कर दिया गया था, और अब स्टोरीबोर्ड में सभी xib फ़ाइलों को घोंसला बनाना बहुत कठिन है। इसलिए मैं इसे कोड में करने का एक तरीका देख रहा था, जैसे कि alloc, init, pushव्यूकंट्रोलर्स के लिए। मेरे मामले में मेरे पास स्टोरीबोर्ड में केवल एक नियंत्रक है: UITableViewControllerजिसमें स्थिर सामग्री है जिसमें कुछ सामग्री है जिसे मैं दिखाना चाहता हूं। अगर किसी को भारी रिफैक्टिंग के बिना जिब और स्टोरीबोर्ड दोनों के साथ काम करने का उचित तरीका पता है, तो मैं किसी भी मदद के लिए सराहना करूंगा।

जवाबों:


370

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

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"myViewController"];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:NULL];

65
[sb instantiateInitialViewController]यदि आप दृश्य के डिफ़ॉल्ट दृश्य नियंत्रक पर शुरू करना चाहते हैं तो यह आसान है।
4:15 बजे

जेम्स, धन्यवाद! मैं काफी समय से यह पता लगाने की कोशिश कर रहा था कि स्टोरीबोर्ड के दृश्य को तुरंत कैसे दिखाया जाए। आपका उत्तर (और कोकोको प्रश्न) खोजने के लिए सबसे ताज़ा हैं।
बेजोनबी

जेम्स बिथ के कोड पर, किसी को पुन: उपयोग करना चाहिए कि UIViewControler * vc यदि यह वर्तमान दृश्यमापी के साथ आगे और पीछे स्विच किया जाता है। मुझे यह पता चला कि vc चारों ओर चिपक गया है और जब तक उपयोगकर्ता नए दृश्य पर एक बटन नहीं दबाता है, तब तक हार्ड ड्राइव मिलती है, और अब इस कोड की पूर्व आवृत्तियों से उस खारिज वीसी के साथ एक स्मृति रिसाव है।
स्वीडन

11
यदि कोई यह जानना चाहता है कि ऐप प्रतिनिधि में यह कैसे करना है, तो आप [self presentViewcontroller]निम्न क्रम में इन पंक्तियों के साथ तर्क को प्रतिस्थापित करें : 1) self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];2) self.window.rootViewController = vc;और 3) [self.window makeKeyAndVisible];। आप शायद modalTransitionStyleरेखा से छुटकारा भी पा सकते हैं क्योंकि यह ऐप प्रतिनिधि से कोई मोडल ट्रांस्फ़ॉर्म नहीं है।
lewiguez

FYI करें, अगर आप न्यू स्टोरीबोर्ड को सामान्य रूप से पॉप अप करने के बजाय "पुश" करना चाहते हैं, तो chaithraVeeresh के उत्तर को देखें।
एडम जॉन्स

76

स्विफ्ट 3

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "viewController")
self.navigationController!.pushViewController(vc, animated: true)

स्विफ्ट 2

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("viewController")
self.navigationController!.pushViewController(vc, animated: true)

शर्त

अपने व्यू कंट्रोलर को स्टोरीबोर्ड आईडी असाइन करें ।

स्टोरीबोर्ड आईडी

IB> आइडेंटिटी इंस्पेक्टर> आइडेंटिटी> स्टोरीबोर्ड आईडी दिखाएं

स्विफ्ट (विरासत)

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("viewController") as? UIViewController
self.navigationController!.pushViewController(vc!, animated: true)

संपादित करें: स्विफ्ट 2 ने फ्रेड ए की टिप्पणी में सुझाव दिया

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

    let Storyboard  = UIStoryboard(name: "Main", bundle: nil)
    let vc = Storyboard.instantiateViewController(withIdentifier: "viewController")
    present(vc , animated: true , completion: nil)

1
स्विफ्ट 2 में, आपको "के रूप में? UIViewController" को जोड़ने की आवश्यकता नहीं है, संकलक इसे स्वचालित रूप से निर्धारित करता है
Frédéric Adda

2
या आप बस कर सकते हैं self.storyboardऔर 221 पर लाइन 1 और 2
हनी

17

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

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
DetailViewController *detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];
[self.navigationController pushViewController:detailViewController animated:YES];

5

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

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"Login"];

[[UIApplication sharedApplication].keyWindow setRootViewController:vc];

यदि आप एक UINavigationController अन्य उत्तरों में दिखाए गए अनुसार उपयोग नहीं कर रहे हैं तो इसका उपयोग करें
latenitecoder

2

स्विफ्ट
नेविगेशनकंट्रोलर और पुशकंट्रोलर में आप बदल सकते हैं

present(vc, animated:true , completion: nil)

1

के लिए तेजी से 3 और 4 , आप ऐसा कर सकते हैं। अच्छा अभ्यास StoryboardID के बराबर स्टोरीबोर्ड का सेट नाम है।

enum StoryBoardName{
   case second = "SecondViewController"
}
extension UIStoryBoard{
   class func load(_ storyboard: StoryBoardName) -> UIViewController{
      return UIStoryboard(name: storyboard.rawValue, bundle: nil).instantiateViewController(withIdentifier: storyboard.rawValue)
   }
}

और फिर आप अपने स्टोरीबोर्ड को अपने ViewController में इस तरह लोड कर सकते हैं:

class MyViewController: UIViewController{
     override func viewDidLoad() {
        super.viewDidLoad()
        guard let vc = UIStoryboard.load(.second) as? SecondViewController else {return}
        self.present(vc, animated: true, completion: nil)
     }

}

जब आप एक नया स्टोरीबोर्ड बनाते हैं तो स्टोरीबोर्ड पर एक ही नाम सेट करें और अपने एनम में स्टोरीबोर्ड का नाम जोड़ें " StoryBoNName "


0

आप हमेशा रूट कंट्रोलर से सीधे कूद सकते हैं:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [storyboard instantiateInitialViewController];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:NULL];

0

नीचे दिया गया एक्सटेंशन आपको लोड करने की अनुमति देगा Storyboardऔर यह संबद्ध है UIViewController। उदाहरण: यदि आपके पास एक UIViewControllerनाम ModalAlertViewControllerऔर एक स्टोरीबोर्ड है जिसका नाम "ModalAlert" है

let vc: ModalAlertViewController = UIViewController.loadStoryboard("ModalAlert")

दोनों लोड होगा Storyboardऔर UIViewControllerऔर vcप्रकार के हो जाएगा ModalAlertViewControllerनोट मानता है कि स्टोरीबोर्ड की स्टोरीबोर्ड आईडी का स्टोरीबोर्ड के समान नाम है और स्टोरीबोर्ड को इनिशियल व्यू कंट्रोलर के रूप में चिह्नित किया गया है ।

extension UIViewController {
    /// Loads a `UIViewController` of type `T` with storyboard. Assumes that the storyboards Storyboard ID has the same name as the storyboard and that the storyboard has been marked as Is Initial View Controller.
    /// - Parameter storyboardName: Name of the storyboard without .xib/nib suffix.
    static func loadStoryboard<T: UIViewController>(_ storyboardName: String) -> T? {
        let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
        if let vc = storyboard.instantiateViewController(withIdentifier: storyboardName) as? T {
            vc.loadViewIfNeeded() // ensures vc.view is loaded before returning
            return vc
        }
        return nil
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.