2012-04-02 21 views
5

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

enter image description here

समस्या के साथ मेरे रिश्ते की स्थापना हो रहा है। मैंने दूसरे फॉर्म से नेविगेशन कंट्रोलर पर क्लिक किया है और पॉप अप मुझे 'पुश, मोडल या कस्टम' से एक विकल्प प्रदान करता है। मैंने 'पुश' चुना है लेकिन जब मैं नीचे कोड चलाने की कोशिश करता हूं तो यह काम नहीं करता है।

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSUInteger row = [indexPath row]; 
    NSString *tSel = [listContents objectAtIndex:row]; 

    ConstantRateController *detailController = [[ConstantRateController alloc] initWithNibName:@"ConstantRateController_iPhone" bundle:nil];   
    [self.navigationController pushViewController:detailController animated:YES] 
} 

मैंने डीबगर के माध्यम से कोड चलाया है और यह त्रुटि के बिना चलता है लेकिन अगला फॉर्म प्रदर्शित नहीं होता है।

उत्तर

9

अपने विवरण है, उससे लगता है जैसे वहाँ तीन समस्याएं हैं:

  1. पुश segues की आवश्यकता है कि स्रोत दृश्य नियंत्रक में एक नेविगेशन नियंत्रक में एम्बेड किया गया - इसके बजाय, आपके पास स्रोत दृश्य नियंत्रक से को नेविगेशन नियंत्रक को segue करने का प्रयास कर रहा है।

  2. गंतव्य दृश्य नियंत्रक को स्टोरीबोर्ड में भी होना चाहिए।

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

इसके बजाय

:

  1. एक नेविगेशन नियंत्रक, और टैब दृश्य नियंत्रक में नेविगेशन नियंत्रक में अपने तालिका दृश्य नियंत्रक रखो।(आप इसे संपादक> एम्बेड करें मेनू में, या लाइब्रेरी से बाहर खींचकर और उनके बीच "रिलेशनशिप" कनेक्शन खींचकर कर सकते हैं।)

  2. स्टोरीबोर्ड में अपना गंतव्य दृश्य नियंत्रक रखें (यदि यह नहीं है वहां पहले से ही) लाइब्रेरी से व्यू कंट्रोलर खींचकर और अपनी कक्षा को अपने व्यू कंट्रोलर क्लास (ConstantRateController) पर सेट करके।

  3. खींचें गंतव्य दृश्य नियंत्रक करने के लिए तालिका दृश्य सेल से एक धक्का segue:

drag to create segue

सभी तीन चरणों के बाद, अपने स्टोरीबोर्ड इस तरह दिखना चाहिए:

enter image description here

अंत में, तालिका दृश्य नियंत्रक में, निम्न लागू करें:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    // test segue.identifier if needed 
    MyViewController *viewController = segue.destinationViewController; 
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
    // set properties of viewController based on selection indexPath 
} 

segue दृश्य नियंत्रक बनाता है और धक्का देता है; आपको बस इतना करना है कि इसे कॉन्फ़िगर करें ताकि इसकी सामग्री तालिका चयन को प्रतिबिंबित करे जो सेगू का कारण बनती है। (ध्यान दें कि यदि आप तालिका दृश्य नियंत्रक से कई segues है, तो आप आईबी में प्रत्येक एक अद्वितीय पहचानकर्ता देने के लिए और prepareForSegue:sender: पर परीक्षण करना उचित गंतव्य दृश्य नियंत्रक कॉन्फ़िगर करने के लिए करना चाहिए।)


आप एक से अधिक का समर्थन करने की जरूरत है तालिका दृश्य से बाहर segues किस सेल पर चुना गया था, यह थोड़ा अलग है। जाहिर है, स्टोरीबोर्ड उन कोशिकाओं के बारे में नहीं जान सकता जो आपके प्रतिनिधि/डेटा स्रोत द्वारा आबादी में हैं, इसलिए आप सेल से सीग्स सेट नहीं कर सकते हैं ... कम से कम गतिशील तालिका में नहीं।

ऐसा लगता है कि आप सेटिंग दृश्य की तरह कुछ हो सकते हैं जहां आपके पास कक्षों का एक स्थिर सेट है जहां प्रत्येक को किसी अन्य दृश्य (जैसे सेटिंग के कुछ पृष्ठ) पर जाना चाहिए। उस स्थिति में, आप स्टोरीबोर्ड से प्राप्त एक और विशेषता को देखना चाहेंगे: स्थिर तालिका। यदि आप आईबी में टेबल व्यू (टेबल व्यू कंट्रोलर नहीं) का चयन करते हैं, तो विशेषता इंस्पेक्टर के शीर्ष आपको गतिशील प्रोटोटाइप और स्टेटिक सेल के बीच टॉगल करने देता है - पूर्व जो मैंने ऊपर वर्णित किया है, और बाद वाला आपको कोशिकाएं बनाने देता है और अनुभाग और आईबी में पूरी तरह से अपनी सामग्री संपादित करें। स्थैतिक कोशिकाओं के साथ आप प्रत्येक से एक अलग सेगू बना सकते हैं ... ताकि आप बहु-पृष्ठ सेटिंग्स-जैसी यूआई को पूरी तरह से आईबी में पूरी तरह से बना सकें (बेशक, स्विच करने के दौरान आपको कुछ करने के लिए कोड की आवश्यकता होगी और क्या नहीं)।

आप एक गतिशील तालिका से बाहर कई segues समर्थन करने के लिए की जरूरत है, तो आप दो चीजों की आवश्यकता होगी:

  1. segues के लिए एक अलग मूल - यदि आप अनेक segues बाहर आने नहीं हो सकता है एक सेल के, लेकिन आप (टेबल) दृश्य नियंत्रक से बाहर कई segues बाहर आ सकते हैं।

  2. उपयोगकर्ता की कार्रवाई के आधार पर एक segue चुनने के लिए तर्क। यहां हम tableView:didSelectRowAtIndexPath: पर वापस आ गए हैं, लेकिन नया दृश्य नियंत्रक बनाने और इसे नेविगेशन नियंत्रक पर धक्का देने या इसे सामान्य रूप से पेश करने के बजाय, आप self पर performSegueWithIdentifier: पर कॉल करें।

वहाँ एक छोटे से अधिक Apple's view controllers guide में this answer में इस तरह के पर विस्तार, और अधिक सामान्य रूप में स्टोरीबोर्ड प्रोग्रामिंग प्रथाओं पर है:

+0

आपके उत्तर के लिए धन्यवाद, मैंने निर्देशों का पालन किया है और उपर्युक्त कोड जोड़ा है, लेकिन जब मैं इसे तैयार करता हूं तो ForSegue कभी नहीं बुलाया जाता है। मुझे क्या याद आया? – user616076

+0

शीर्ष अनुमान: 1) क्या आपका 'तैयार करने के लिए: प्रेषक:' सही वर्ग में विधि है? यह दृश्य नियंत्रक में होना चाहिए जो segue (आपकी तालिका दृश्य नियंत्रक) शुरू करता है। 2) तालिका दृश्य नियंत्रक वास्तव में कक्षा है? यह सुनिश्चित करने के लिए आईबी में पहचान निरीक्षक की जांच करें कि यह अभी भी एक सामान्य 'UITableViewController' नहीं है। – rickster

+0

यह ठीक काम कर रहा है अब धन्यवाद, ऐसा इसलिए था क्योंकि मैंने सेग्यू पहचानकर्ता को ठीक से सेट नहीं किया था। क्या होता है यदि मैं एकाधिक सेगुए में स्विच करना चाहता हूं, तो मेरी तालिका से प्रत्येक चयन 10 अन्य रूपों में से किसी एक पर जा सकता है? – user616076

0

"loadView" विधि को निकालने का प्रयास करें और ViewDidLoad को ViewController क्लास पर छोड़ दें जिसे आप दिखाना चाहते हैं।

2

आमतौर पर जब आप एक नव नियंत्रक का उपयोग करना चाहते हैं, आप इसे एम्बेड करने के लिए है ...

Xcode नेविगेशन और टैब बार नियंत्रकों में जोड़ने के लिए एक शानदार तरीका शामिल हैं - हालांकि यह एक छोटा सा दूर छिपा हुआ है । सबसे पहले, देखें नियंत्रक का चयन करें और संपादक मेनू पर जाएं -> एम्बेड करें -> टैबबार नियंत्रक। एक्सकोड स्वचालित रूप से हमारे नए नियंत्रक और मौजूदा दृश्य नियंत्रक को लिंक करेगा। दोबारा, देखें नियंत्रक का चयन करें और इस बार संपादक मेनू पर जाएं -> एम्बेड करें -> नेविगेशन नियंत्रक। आप देखेंगे कि एक्सकोड टैब बार नियंत्रक और दृश्य नियंत्रक के बीच नया नेविगेशन नियंत्रक सम्मिलित करता है। बहुत अच्छा - अब तक, बहुत अच्छा! आपके विचार इस तरह दिखना चाहिए ...

[से: http://maybelost.com/2011/10/tutorial-storyboard-in-xcode-4-2-with-navigation-controller-and-tabbar-controller-part1/]

0

आप तीन segues देखना ('पुश, मॉडल या कस्टम') और नहीं 'देख पा रहे हैं रूट व्यू कंट्रोलर 'यदि आपके पास अपने कस्टम क्लास को बदलकर नियमित व्यू कंट्रोलर से कनवर्ट किया गया नेविगेशन कंट्रोलर है। हां, इसे स्टोरीबोड में नेविगेशन कंट्रोलर कहा जाता है। लेकिन इसका पीला आइकन अलग है। इसमें गुणों में 'नेविगेशन नियंत्रक' अनुभाग की कमी है और यह नेविगेशन नियंत्रक के रूप में काम नहीं करता है। इसे स्टोरीबोर्ड फ़ाइल के एक्सएमएल स्रोत को बदलकर तय किया जा सकता है। यह वास्तव में भ्रमित है कि वे इसे "एम्बेड" क्यों कहते हैं ..

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