2012-03-27 14 views
138

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

उत्तर

314

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

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

'[sb instantiateInitialViewController] 'यदि आप दृश्य के डिफ़ॉल्ट दृश्य नियंत्रक पर प्रारंभ करना चाहते हैं तो आसान है। – drewish

+0

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

+0

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

14

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

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

प्रयास करें इस

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

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

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

42

स्विफ्ट 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) 

पूर्वापेक्षा

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

Storyboard ID

आईबी> दिखाएँ पहचान निरीक्षक> पहचान> स्टोरीबोर्ड आईडी

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

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

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

+1

स्विफ्ट 2 में, आपको "as? UIViewController" जोड़ने की आवश्यकता नहीं है, संकलक स्वचालित रूप से –

+2

निर्धारित करता है या आप केवल 'self.storyboard' कर सकते हैं और लाइन 1 और 2 मर्ज करें – Honey

2

तेज
navigationController और pushController में आप तेज 3 और 4 के लिए के लिए

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

जगह ले सकता है, तो आप ऐसा कर सकते हैं। अच्छी प्रैक्टिस स्टोरीबोर्ड आईडी के बराबर स्टोरीबोर्ड का नाम सेट है।

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) 
    } 

}

आपके द्वारा बनाए गए जब एक नया स्टोरीबोर्ड सिर्फ StoryboardID पर एक ही नाम की स्थापना की और में स्टोरीबोर्ड नाम जोड़ने आपका enum "स्टोरीबार्डनाम"

0

आप हमेशा रूट नियंत्रक पर कूद सकते हैं:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
UIViewController *vc = [storyboard instantiateInitialViewController]; 
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
[self presentViewController:vc animated:YES completion:NULL]; 
संबंधित मुद्दे

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