2013-04-05 4 views
6

मैं अपने ऐप में Storyboard का उपयोग कर रहा हूं और मैं डेटा को एक दृश्य से दूसरे दृश्य में पास करना चाहता हूं।instantiateViewControllerWithIdentifier और पास डेटा

segues का उपयोग करने के बजाय मैं instantiateViewControllerWithIdentifier का उपयोग कर रहा हूं। इस मामले में मैं अपने पहले TableViewController से NavigationController पर तत्काल हूं, जिसमें दूसरा TableViewController संलग्न है क्योंकि मुझे दूसरे TableViewController में नेविगेशन की आवश्यकता है। अब मैं अपने पहले TableviewController से डेटा पास करना चाहता हूं, जिस पर मेरी पंक्ति TableviewController पर क्लिक की गई थी। इस मामले में newTopViewController मेरा NavigationController होगा लेकिन मेरी समस्या अब firstTableViewController से secondTableviewController पर डेटा को कैसे पास करें।

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     NSString *identifier = [NSString stringWithFormat:@"%@Top", [menuArray objectAtIndex:indexPath.row]]; 


     UIViewController *newTopViewController = [self.storyboard instantiateViewControllerWithIdentifier:identifier]; 




    } 

enter image description here

+0

[देखें नियंत्रकों के बीच डाटा पासिंग] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers) –

+0

मैं नहीं इस पोस्ट में एक समाधान दिख रहा है। मैं तत्काल नियंत्रक का उपयोग कर रहा हूं क्योंकि मैं segues का उपयोग नहीं करता हूं। तो क्या मैं अभी भी readyforsegue का उपयोग कर सकता हूं क्या कोई सीगू नहीं है? – halloway4b

+0

जहां एक व्यू कंट्रोलर तत्काल है, उसे यह नहीं बदला जाना चाहिए कि आप इसे संदेश कैसे पास करते हैं। –

उत्तर

14

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

कुछ इस तरह:

UINavigationController *navigationController = [self.storyboard instantiateViewControllerWithIdentifier:identifier]; 
MBFancyViewController *viewController = navigationController.viewControllers[0]; 

// setup "inner" view controller 
viewController.foo = bar; 

[self presentViewController:navigationController animated:YES completion:nil]; 
+0

आपने इसे खींचा। बहुत धन्यवाद। इस संकेत के साथ मुझे पता चला कि UINavigationController में शीर्ष दृश्य कंट्रोलर नामक एक संपत्ति है। बहुत धन्यवाद। दोनों तरीकों से एक आकर्षण की तरह काम करता है। मैंने आपके उत्तर को दूसरी तरफ संपादित किया है। – halloway4b

+0

कमाल का समाधान। इसने मेरी बहुत मदद की। बहुत धन्यवाद –

5
newTopViewController.anyVariableToShow= anyVariableToSend; 

मैं अपने ऐप्स के कुछ पर बहुत अक्सर ऐसा करते हैं ...

// नई कुलपति

CookViewController *detailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"CookVC"]; 

//Set recipe 
[detailViewController setRecipe:recipe]; 

//Pop over VC (can be pushed with a nav controller) 
[self presentPopupViewController:detailViewController animationType:MJPopupViewAnimationFade]; 

बनाएं आप नहीं कर रहे हैं एक नेविगेशन नियंत्रक या segues का उपयोग कर, तो मुझे लगता है कि आपको अपने ऐप डिज़ाइन पर पुनर्विचार करने की आवश्यकता है।

+0

newTopViewController एक नेविगेशन नियंत्रक है लेकिन मैं डेटा को अपने दूसरेTableViewController पर पास करना चाहता हूं। – halloway4b

+0

दृश्य नियंत्रक के रूप में नए शीर्ष शो –

+0

यदि मैं newTopViewController.title = @ "जो कुछ भी कहता हूं"; शीर्षक बदलता नहीं है क्योंकि दूसराTableviewController एक नेविगेशनबार के साथ प्रदर्शित होता है। अगर मैं दूसरेTableViewController को तुरंत चालू कर दूंगा तो मैं दूसरेTableViewController.title = @ "जो कुछ भी" डेटा पास कर सकता हूं लेकिन मेरे पास मेरे टेबलव्यू में एक नेविगेशनबार नहीं है। – halloway4b

0

वास्तव में यह सिर्फ एक डेटा पास समस्या नहीं है क्योंकि यह एक कार्यक्रम नियंत्रण और डाटा हस्तांतरण सवाल एक साथ है। यहां तक ​​कि आपको अपने ऐप की अवधारणा के बारे में भी पुनर्विचार करना होगा, क्योंकि आप स्टोरीबोर्ड के अर्थ के बिना स्टोरीबोर्ड का उपयोग करना चाहते हैं, यह आपके ऊपर है और मुझे उम्मीद है कि आपके पास जो भी करना है, उसके लिए आपके पास अच्छा कारण है।

तो जब आपने सेग्यू का उपयोग न करने का निर्णय लिया तो आपने नए नियंत्रक को तुरंत चालू करने और इसके साथ डेटा स्थानांतरित करने का नया और आरामदायक तरीका खो दिया और आपको नियंत्रण और डेटा को दो अलग-अलग चरणों में स्थानांतरित करना होगा। जब आप स्टोरीबोर्ड में एक और दृश्य को तुरंत चालू करते हैं (जैसे आप तत्काल ViewControllerWithIdentifier के साथ करते हैं :) आपने बस एक नया नियंत्रक तुरंत चालू किया और नियंत्रण स्थानांतरित किया लेकिन डेटा नहीं। बस इसके बारे में सोचें क्योंकि आपने एक पुराने तरीके से एक एक्सबी से एक नए नियंत्रक को तुरंत चालू किया है (इसलिए आपको initWithCoder का उपयोग करना होगा: या दूसरे व्यू कंट्रोलर में awakeFromNib के रूप में स्टोरीबोर्ड initWithName: बंडल नहीं कॉल करेगा :), लेकिन कुछ और नहीं किया ।

तो आपके पास एक नया नियंत्रक होगा (यह दूसरे स्टोरीबोर्ड के पहचान भाग में नामित है) जो ब्रह्मांड में किसी भी रिश्ते या किसी अन्य चीज़ के साथ कनेक्शन के बिना लटक रहा है (जैसा स्टोरीबोर्ड चित्र इसे अच्छी तरह से दिखाता है) और आप कर सकते हैं इसके साथ आप क्या चाहते हैं।

तो आप कुछ करना चाहते हैं और आपको पिछले स्टोरीबोर्ड (व्यू कंट्रोलर) से डेटा चाहिए। आपको जो चाहिए वह दूसरे स्टोरीबोर्ड (व्यू कंट्रोलर) पर डेटा उपलब्ध करा रहा है, और जैसा कि आप जानते हैं कि इसके लिए बहुत सारे समाधान हैं जो स्टोरीबोर्ड मौजूद होने से पहले लंबे समय तक उपलब्ध थे।

तो आपके कोड के संबंध में, "डेटा स्थानांतरण" आपके डिज़ाइन के आधार पर है, चाहे दोनों नियंत्रक एक-दूसरे के सबक्लास हैं या जो कुछ भी ...

यदि आप सबक्लासिंग से निपटना पसंद नहीं करते हैं और जितना संभव हो सके उन्हें डीकॉप्लिंग करना पसंद करते हैं, तो सबसे अच्छा तरीका केवल पहले नियंत्रक में अपने डेटा की संपत्ति बनाते हैं और उन्हें दूसरे से संदर्भित करते हैं (पहले के आयात के बाद ज फ़ाइल) और बस में संदर्भित viewDidLoad या initWithCoder में है: या कहीं भी जहाँ आप उन्हें जरूरत है,

secondViewControllerdata = firstViewControllerdata.thatDataProperty 
बेशक

के रूप में आप रिवर्स में भी ऐसा ही है और दूसरी नियंत्रक की संपत्ति बनाने के लिए और उल्लेख कर सकते हैं अपने पहले दृश्य नियंत्रक में इसे करने के लिए।

0

आप UIViewController में कुछ पैरामीटर परिभाषित कर सकते हैं डेटा प्राप्त करने:

@property (असाइन) पूर्णांक param1;

@property (बनाए रखें) एनएसएमयूटेबलएरे * param2;

और डेटा पारित करने के लिए नीचे दिए गए का उपयोग करें:

[newTopViewController setParam1: XX];

[newTopViewController setParam2: XX];

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