स्टोरीबोर्ड के साथ कस्टम दृश्य


96

जटिल स्क्रीनों में (कंट्रोलर्स देखें) मैं पूरी चीज़ को छोटे टुकड़ों में अलग करता था (मैं उन्हें विगेट्स कहता हूं)। ये विजेट एक के मूल रूप से मिलकर बनता है MyWidget.hऔर एक MyWidget.mअच्छी तरह से एक के रूप में के रूप में फ़ाइल MyWidget.xibफ़ाइल, जहां मूल तत्व एक है UIViewऔर MyWidget वर्ग UIView की फ़ाइल के मालिक है। इस विजेट के init में मैं a loadNibNamed

मेरे दृश्य नियंत्रक में मैं तब करता हूं [[MyWidget alloc] init], जिसे मैं दृश्य के नियंत्रक के मुख्य दृश्य में उप दृश्य के रूप में जोड़ता हूं। यह, अब तक, पूरी तरह से काम करता है।

मैं अब सोच रहा हूं, स्टोरीबोर्ड के साथ भी ऐसा ही किया जाए, क्योंकि मैं वास्तव में UIViewकहीं खींचना शुरू नहीं कर सकता , मुझे हमेशा एक के साथ शुरू करना होगा UIViewController, जिसे मैं नहीं करना चाहता।

अगर स्टोरीबोर्ड के साथ ऐसा करने का कोई संभावित तरीका नहीं है, तो क्या मैं मुख्य रूप से अपनी मुख्य स्क्रीन और सेगमेंट के लिए स्टोरीबोर्ड का उपयोग करके, और पुराने विचारों को परिभाषित करने के लिए एक अलग .xib फ़ाइल का उपयोग कर सकता हूं?


क्या आप xibअपने दृश्य नियंत्रकों के लिए अलग से कहानी और बोर्ड में नहीं बनाना चाहते हैं?
टिपीकालफ्लो

क्या आपको इसका हल मिला?
आर्येक्स

@aryaxt: मैं स्टोरीबोर्ड और xib's के मिश्रण का उपयोग कर रहा हूं। मुख्य स्क्रीन के लिए स्टोरीबोर्ड और जटिल विचारों या विगेट्स के लिए रूट के रूप में केवल एक यूआईवीयूवी के साथ xib। तो वास्तव में मेरे मूल प्रश्न का उत्तर नहीं है (स्टोरीबोर्ड का उपयोग करके), लेकिन मूल रूप से वही कर रहा हूं जो मैंने पहले ही किया था।
15

इन दिनों, बस एक कंटेनर दृश्य का उपयोग करें , यह वास्तव में इतना आसान है .. stackoverflow.com/questions/23399061/…
फेटी

जवाबों:


189

विजेट / दृश्य को एक अलग .xib फ़ाइल में रखना, और विशेष रूप से उपयुक्त है, यदि आप एकाधिक व्यू कंट्रोलर्स से उसी दृश्य को संदर्भित करना चाहते हैं।

हालाँकि, कभी-कभी आप एक ही स्टोरीबोर्ड के भीतर अतिरिक्त दृश्य / विजेट देखना चाहते हैं, और यह संभव है। यहाँ आप इसे कैसे करते हैं:

  1. IB में अपने व्यू कंट्रोलर का चयन करें (दृश्य के नीचे काली पट्टी पर क्लिक करें), फिर ऑब्जेक्ट लाइब्रेरी से एक UIView को काली पट्टी में खींचें:

    यहां छवि विवरण दर्ज करें

  2. जब कोई दृश्य काली पट्टी में होता है, तो उसे आईबी में किसी भी अन्य दृश्य की तरह त्वरित किया जाता है, लेकिन जब तक आप कोड में ऐसा नहीं करते, तब तक अपने दृश्य पदानुक्रम में नहीं जोड़ा जाता है। यदि आवश्यक हो तो अपने स्वयं के उपवर्ग से मिलान करने के लिए दृश्य की कक्षा बदलें:

    यहां छवि विवरण दर्ज करें

  3. आप इसे अपने व्यू कंट्रोलर को हुक कर सकते हैं जैसे आप किसी अन्य दृश्य को हुक करेंगे: यहां छवि विवरण दर्ज करें

  4. जोड़ा गया दृश्य आपके दस्तावेज़ की रूपरेखा में दिखाई देता है और आप वहाँ भी क्रियाओं और संदर्भों को हुक कर सकते हैं:

    यहां छवि विवरण दर्ज करें


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

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

अन्य वर्कअराउंड अधिक बारीक है, लेकिन मैं इसे पसंद करता हूं क्योंकि यह मुझे एक ही समय में मेरे सभी विचार देखने देता है:

  1. अपने नए जोड़े गए दृश्य में ऑब्जेक्ट लाइब्रेरी से एक UITableView खींचें।

  2. फिर एक UITableViewCell को उस UITableView में खींचें।

    यहां छवि विवरण दर्ज करें

  3. एक बार जब आप ऐसा करते हैं, तो आपका दृष्टिकोण जादुई रूप से पक्ष से बाहर हो जाता है, लेकिन आपके पास एक UITableView है जो आप नहीं चाहते हैं। आप या तो 0x0 का आकार बदल सकते हैं, या आप इसे हटा सकते हैं और आपका UIView (आमतौर पर) अभी भी दिखाई देगा।

  4. कभी-कभी माध्यमिक दृश्य आईबी में फिर से छिप जाएगा। यदि आपने UITableView हटा दिया है या आप अभी भी पदानुक्रम में हैं, तो आप उपरोक्त चरणों को दोहरा सकते हैं, आपको केवल UITableViewCell पर क्लिक करने की आवश्यकता है और दृश्य फिर से दिखाई देगा।

दूसरी विधि UIViews के लिए काम करती है, लेकिन UIToolbars के लिए इतनी अच्छी तरह से नहीं है और UIButtons के लिए असंभव है, इसलिए मैंने जो सबसे अलग समाधानों को शामिल करने की आवश्यकता की है, उसे साफ करने के लिए सबसे साफ समाधान एक एकल माध्यमिक UIView को एक कंटेनर के रूप में आपके विचार नियंत्रक में संलग्न करना है कभी नहीं दिखाया जाता है, अपने सभी माध्यमिक विचारों को वहां रखें और सब कुछ दिखने के लिए UITableViewCell ट्रिक का उपयोग करें। मैं उस अदृश्य को बनाने के लिए 0x0 पर अपनी डमी UITableView का आकार बदलता हूं। यहाँ एक स्क्रीनशॉट है कि यह सब एक साथ कैसा दिखता है:

यहां छवि विवरण दर्ज करें


मार्च 2013, मुझे ऐसा करने की आवश्यकता नहीं थी - आपको काली पट्टी को पूरी तरह से अनदेखा करना चाहिए, और अपने विचार को सीधे मुख्य दृश्य में खींचें / छोड़ें, और यह ठीक काम करता है (Xcode 4.5+)
एडम

क्या एक ही ViewController पर कस्टम uivew का पुन: उपयोग करना संभव है - यदि मैं पूर्व। जरूरत दो कस्टम uivews - और अगर यह कैसे है?
मोर्टन गुस्ताफसन

2
डांग, मैं सिर्फ एक अलग xib बनाना पसंद करता हूं। मुझे शायद यह सब याद नहीं होगा जब मुझे 6 महीने में ऐप को अपडेट करना होगा।
सैंडी

हालांकि यह एक शानदार जवाब है, मुझे लगता है कि मुझे एक और बेहतर तरीका मिला। जब आउटलेट को वास्तविक दृश्य घटकों के लिए हुक किया जाता है। यदि आप इस तरह के एक आंतरिक दृश्य के एक घटक पर थोड़ा मंडराना करते हैं - यह आसान चयन के लिए पॉप अप करता है। फिर आप इसे स्टोरीबोर्ड पर देखें ...
Oded Ben Dov

7
हालांकि यह एक अविश्वसनीय रूप से सराहनीय ऐतिहासिक जवाब है, वास्तव में यह अब पूरी तरह से पुराना है। Apple ने "कंटेनर दृश्य" को शुरू करके पूरे मुद्दे को ठीक कर दिया, जो कि अब केंद्रीय, बुनियादी चीज है जो आप ऐप बनाते समय करते हैं - हर समय एक "कंटेनर दृश्य"। शुक्रिया, यह अब बहुत आसान है!
फेटी

11

यदि आप अपने दृश्य नियंत्रकों को और अधिक बनाने के लिए देख रहे हैं-जहां (और आपकी कहानी-बोर्ड में नहीं), तो इसे पूरा करने का एक सरल तरीका है:

1) हमेशा की तरह अपने व्यक्ति के साथ अपना कोड CustomViewController( abcdControllerमैंने कोशिश की गई कोड में ) बनाएं xib

2) कहानी-बोर्ड में एक UIViewController(या जो कुछ भी आपका सुपरक्लास था ) जोड़ें CustomViewController

3) को CustomClass सेट CustomViewControllerके बजाय UIViewControllerजैसा कि यहाँ दिखाया:

यहां छवि विवरण दर्ज करें

4) अंत में, अपने में viewDidLoad, कस्टम लोड करें xibऔर आप कर रहे हैं।

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSBundle mainBundle] loadNibNamed:@"abcdController" owner:self options:nil];
    // Do any additional setup after loading the view from its nib.
}

3
आपके बहुत विस्तृत उत्तर के लिए धन्यवाद, लेकिन मैं वास्तव में एक कस्टम व्यू कंट्रोलर की तलाश नहीं कर रहा हूं, बल्कि एक कस्टम व्यू (एक विजेट), जो एक मानक UIViewController में जुड़ जाता है। तो दृश्य नियंत्रक समस्या नहीं है, लेकिन मैं सोच रहा था कि कस्टम विजेट बनाने के लिए सबसे अच्छा तरीका क्या है। या तो ए) जैसा कि मैंने पहले किया था, एक .xib फ़ाइल या बी के साथ) कुछ अन्य दृष्टिकोण जो मुझे नहीं पता, फिर भी :-)
znq

1
हम्म ... मुझे लगता है कि मुझे वह मिला जो आप चाहते हैं। मूल रूप से आप एक ही नियंत्रक के साथ कई विचारों को संभालना चाहते हैं, है ना? मैं loadNibNamedउस मामले के अलावा एक तरह से सोच भी नहीं सकता ... XO
tipycalFlow

इसने मेरे लिए इस समस्या को हल कर दिया: stackoverflow.com/questions/11047991/… हालाँकि, viewDidLoad के बजाय, मैंने loadView का उपयोग किया ...
Morkrom

1
बस दोहराने के लिए, यह सब (शुक्रिया शुक्रिया!) पूरी तरह से तारीख से बाहर है कि अब कंटेनर विचार यहां हैं। बस एक कंटेनर दृश्य पर क्लिक करें और यह सब किया जाता है
फेटी

1

मुझे लगता है कि आप स्टोरीबोर्ड से विशिष्ट व्यू कंट्रौलर का उदाहरण प्राप्त करने के लिए ऐसा कुछ कर सकते हैं और इसके शीर्ष पर दृश्य का उपयोग कर सकते हैं।

ex:
MyViewController* myViewController = [[UIStoryboard storyboardWithName:@"Main"  bundle:nil] instantiateViewControllerWithIdentifier:@"myViewController"];
UIView* view = myViewController.view; //Get the view from your StoryBoard.

उम्मीद है की यह मदद करेगा

धन्यवाद विजय

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.