2013-07-20 5 views
20

मेरे पास एक्सकोड में एक स्टोरीबोर्ड स्थापित है और इसमें मेनव्यू कंट्रोलर है। MainViewController में मैंने एक कंटेनर व्यू जोड़ा है जो स्वाभाविक रूप से एक और VIewController के साथ एक Segue बनाता है।मैं अपने व्यू कंट्रोलर से डेटा कंटेनर व्यू में कैसे पास करूं?

मेरी मेनव्यू कंट्रोलर.एम फ़ाइल में मैंने डेटा सेट अप किया है और इस डेटा को कंटेनर व्यू में एक लेबल से लिंक करना चाहते हैं, हालांकि मैंने सोचा कि मैं फ़ाइल के मालिक पर क्लिक कर सकता हूं और ऐसा कर सकता हूं लेकिन निश्चित रूप से मैं नहीं कर सकता क्योंकि वे हैं अब 2 अलग दृश्य नियंत्रक।

क्या कोई मेरी मदद कर सकता है क्योंकि मैं इसके साथ संघर्ष कर रहा हूं। एक आसान तरीका होना चाहिए लेकिन मैं इसे क्रैक नहीं कर सकता!

धन्यवाद

उत्तर

24

तुम बस किसी भी अन्य दो नियंत्रकों की तरह prepareForSegue उपयोग कर सकते हैं - कि विधि के बाद दो नियंत्रकों instantiated कर रहे हैं बुलाया जाएगा, लेकिन इससे पहले कि या तो viewDidLoad चलाता है। ऐसा करने का दूसरा तरीका माता-पिता नियंत्रक के बच्चे दृश्य नियंत्रक संपत्ति का उपयोग करना है (एम्बेडेड नियंत्रक एक बच्चा है)। तो, बच्चा स्वयं होगा .childViewControllers [0]।

संपादित करने के बाद:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"EmbedSegue"]) { 
     MyEmbeddedController *embed = segue.destinationViewController; 
     embed.labelString = self.stringToPass; 
    } 
} 
बेशक

, आप क्या करने के लिए नाम बदलने के लिए है। सुनिश्चित करें कि आईबी में सीगू को जो नाम दिया गया है, वह उस मैच से मेल खाता है जिसे आप कथन में चेक करते हैं। इस उदाहरण में लेबलस्ट्रिंग एक स्ट्रिंग प्रॉपर्टी है जिसे आपने अपने एम्बेडेड नियंत्रक में स्थापित किया है। फिर उस नियंत्रक के दृश्य में DidLoad विधि, आप उस स्ट्रिंग के साथ लेबल का मान सेट कर सकते हैं।

+0

मैं काफी समझ में नहीं आता। मैं इसके लिए बिल्कुल नया हूं इसलिए यदि आप कोड का कुछ उदाहरण प्रदान करने के लिए बहुत दयालु होंगे तो यह वास्तव में सहायक होगा। – Omar

+0

@ ओमार, मैंने कोड के साथ अपना जवाब संपादित कर लिया है। – rdelmar

+0

इसके लिए धन्यवाद। तो अब मेरे कोड इस तरह दिखता है: - (शून्य) prepareForSegue: (UIStoryboardSegue *) segue इस: (आईडी) इस { अगर ([[segue पहचानकर्ता] isEqualToString: @ "MainChild"]) { MainViewController * एम्बेड = segue.destinationViewController; embed.labelNextPrayer = self.labelNextPrayer; } } हालांकि मैं जिस लेबल को कॉल कर रहा हूं, मैं अभी भी कंटेनर व्यू में कुछ भी लिंक नहीं कर सकता जिसे 'व्यू कंट्रोलर' – Omar

0
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    // Make sure your segue name in storyboard is the same as this line 
    if ([[segue identifier] isEqualToString:@"YOUR_SEGUE_NAME_HERE"]) 
    { 
     // Get reference to the destination view controller 
     YourViewController *vc = [segue destinationViewController]; 

     // Pass any objects to the view controller here, like... 
     [vc setMyObjectHere:object]; 
    } 
} 

मैं भी है कि क्योंकि आप एक कंटेनर दृश्य का उपयोग कर रहे हैं, prepareForSegue ट्रिगर होंगे जब आप ViewController कि कंटेनर रखती पेश करेंगे उल्लेख करना चाहिए।

+0

आपको बहुत बहुत धन्यवाद। मैं '[vc setMyObjectHere: object];' के बारे में थोड़ा उलझन में हूं अनुभाग। मेरे पास आउटलेट के साथ ViewDidLoad विधि में कोड का पूरा ढेर है जो मेनव्यू कंट्रोलर द्वारा उठाया जाता है। मैं बस इन आउटलेट को कंटेनर व्यू में तत्वों से जोड़ने में सक्षम होना चाहता हूं (जो एक सेग्यू से जुड़ा एक अलग दृश्य नियंत्रक है) – Omar

+0

आपको उपरोक्त कोड में डेटा पास करना चाहिए। यदि इसके तार, स्ट्रिंग की एक सरणी बनाएं और उसे पास करें। डेटा पास करने के बारे में मेरा उत्तर यहां देखें: http://stackoverflow.com/a/16670995/1578927 – Segev

5

यह स्विफ्ट में one by rdelmar के समान ही उत्तर है।

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let embeddedVC = segue.destinationViewController as? MyEmbeddedController where segue.identifier == "EmbedSegue" { 
     embeddedVC.labelString = self.stringToPass 
    } 
} 

"EmbedSegue" आप इंटरफ़ेस बिल्डर में सेट segue पहचानकर्ता गया है। स्विफ्ट 4 के लिए

0

उत्तर:

if let controller = segue.destinationController as? MyEmbeddedController, segue.identifier!.rawValue == "EmbedSegue" { 
    controller.labelString = self.stringToPass 
} 
संबंधित मुद्दे