दिलचस्प पोस्ट
image.onload इवेंट और ब्राउज़र कैश int a = {1,2,}; अजीब अल्पविराम की अनुमति कोई विशेष कारण है? देखें: क्रोम डेवलपर टूल में होवर स्थिति बच्चे एनजी-दोहर से माता-पिता एनजी-दोहराने का सूचकांक एक्सेस करें सपाट जेसन से जेनरेट करें (बहुस्तरीय) flare.json डेटा प्रारूप वेबकिट-ट्रांसफॉर्म के वेबकिट-संक्रमण पर फ्लिकर को रोकें PHP के लिए 500 आंतरिक सर्वर त्रुटि html के लिए नहीं UITextField संपादित करते समय कीबोर्ड को कैसे खारिज करते हैं स्विट्स में विलससेट और डससेट का क्या उद्देश्य है? UIImage में एक छवि को अतुल्यकालिक रूप से लोड करना Templated वर्ग में templated सदस्य समारोह के विशेषज्ञ GIT_WORK_TREE क्या है, मुझे इस ENV var को सेट करने की आवश्यकता क्यों नहीं है, अब क्यों? jQuery की तारीख पिक्चर- 2 इनपुट / टेक्स्ट बॉक्स और सीमित सीमा बेस्ट हैशटैग रेगेक्स वेब ब्राउज़र की कुकी की कुंजी का अधिकतम आकार क्या है?

उद्देश्य-सी में अपने स्वयं के UIViewController वाले सबव्यू को कैसे जोड़ें?

मैं उन उपवियों से संघर्ष कर रहा हूं जिनके पास अपने स्वयं के UIViewControllers मेरे पास एक दृश्य (हल्के गुलाबी) के साथ एक UIViewController और toolbar पर दो बटन हैं I मुझे पहला बटन दबाया जाता है और दूसरे बटन के साथ प्रदर्शित करने के लिए पीला व्यू दबाया जाता है जब मैं प्रदर्शित करने के लिए नीले रंग का दृश्य चाहता हूँ। अगर मैं सिर्फ एक दृश्य प्रदर्शित करना चाहता था तो यह आसान होना चाहिए। लेकिन नीले रंग के दृश्य में एक तालिका होगी, इसलिए इसे अपने नियंत्रक की आवश्यकता है यह मेरा पहला सबक था मैंने इस SO प्रश्न के साथ शुरू किया, जहां मैंने सीखा है कि तालिका के लिए एक नियंत्रक की आवश्यकता है I

तो, मैं बैक अप लेने जा रहा हूं और यहां कुछ बच्चे के कदम उठा रहा हूं। नीचे मेरे उपयोगिता दृश्य नियंत्रक (मुख्य व्यू नियंत्रक) और अन्य दो नियंत्रकों (नीले और पीले) के साथ एक सरल प्रारंभिक बिंदु की एक तस्वीर है। कल्पना कीजिए कि जब उपयोगिता दृश्य ViewController (मुख्य दृश्य) पहले प्रदर्शित होता है तो नीले (डिफ़ॉल्ट) दृश्य प्रदर्शित किया जाएगा जहां गुलाबी दृश्य स्थित है। उपयोगकर्ता आगे और पीछे जाने के लिए दो बटन क्लिक करने में सक्षम होंगे और गुलाबी दृश्य प्रदर्शित नहीं किए जाएंगे। मुझे सिर्फ नीले रंग के देखने के लिए जाना है जहां गुलाबी दृश्य है और गुलाबी दृश्य देखने के लिए पीले रंग का दृश्य है। मुझे लगता है कि इसका मतलब बनता है।

सरल स्टोरीबोर्ड छवि

मैं addChildViewController का उपयोग करने की कोशिश कर रहा हूँ मैंने जो देखा है, उससे ऐसा करने के दो तरीके हैं: storyboard में कंटेनर व्यू या प्रोग्राम जोड़ें addChildViewController मैं इसे प्रोग्रामेटिक रूप से करना चाहता हूं मैं NavigationController या टैब बार का उपयोग नहीं करना चाहता मैं सिर्फ नियंत्रकों को जोड़ना चाहता हूं और सही दृश्य को गुलाबी दृश्य में जोड़ना चाहता हूं जब संबद्ध बटन दबाया जाता है।

नीचे मेरे पास अब तक का कोड है। मैं जो सब करना चाहता हूँ वह नीला दृश्य प्रदर्शित करता है जहां गुलाबी दृश्य है मैंने जो देखा है, उससे मैं सिर्फ AddChildViewController और addSubView जोड़ सकता हूं। यह कोड मेरे लिए ऐसा नहीं कर रहा है मेरा भ्रम मुझे बेहतर कर रहा है क्या कोई मुझे ब्लू व्यू प्रदर्शित करता है जहां गुलाबी दृश्य दिखता है?

इस कोड को देखने के लिए ब्लू व्यू प्रदर्शित करने के अलावा कुछ भी करने का इरादा नहीं हैडिडलोड।

IDUtilityViewController.h

 #import <UIKit/UIKit.h> @interface IDUtilityViewController : UIViewController @property (strong, nonatomic) IBOutlet UIView *utilityView; @end 

IDUtilityViewController.m

 #import "IDUtilityViewController.h" #import "IDAboutViewController.h" @interface IDUtilityViewController () @property (nonatomic, strong) IDAboutViewController *aboutVC; @end @implementation IDUtilityViewController - (void)viewDidLoad { [super viewDidLoad]; self.aboutVC = [[IDAboutViewController alloc]initWithNibName:@"AboutVC" bundle:nil]; [self addChildViewController:self.aboutVC]; [self.aboutVC didMoveToParentViewController:self]; [self.utilityView addSubview:self.aboutVC.aboutView]; } @end 

————————– संपादित ———————– ——-

Self.aboutVC.aboutView शून्य है लेकिन मैंने इसे storyboard में तार किया था। क्या मुझे इसे अभी इन्स्तांत करने की ज़रूरत है?

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

वेब के समाधान से एकत्रित समाधान "उद्देश्य-सी में अपने स्वयं के UIViewController वाले सबव्यू को कैसे जोड़ें?"

इस पोस्ट में हमेशा नवीनतम स्विफ्ट सिंटैक्स है, जैसे स्विफ्ट 3/4

आईओएस में आज "सब कुछ एक कंटेनर दृश्य है" यह आजकल आपको ऐप बनाने वाला मूल तरीका है

एक ऐप इतना आसान हो सकता है कि इसमें केवल एक दृश्य दिखाई दे। लेकिन उस मामले में भी, स्क्रीन पर प्रत्येक "चीज़" एक कंटेनर दृश्य है

यह आसान है …


(ए) अपने दृश्य में एक कंटेनर दृश्य खींचें …

अपने दृश्य दृश्य में एक कंटेनर दृश्य खींचें (जैसे आप एक UIButton में खींचें, कहते हैं।)

कंटेनर दृश्य इस छवि में भूरी चीज़ है यह वास्तव में आपके दृश्य दृश्य के अंदर है

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

जब आप अपने दृश्य दृश्य में एक कंटेनर दृश्य खींचते हैं, तो Xcode स्वचालित रूप से आपको दो चीजें देता है:

  1. आप अपने दृश्य दृश्य के अंदर कंटेनर देखें , और,

  2. आपको एक नया UIViewController जो आपके स्टोरीबोर्ड के सफ़ेद पर बस कहीं और बैठा है

दोनों "मेसोनियन प्रतीक" चीज़ से जुड़े हैं – नीचे समझाया!


(बी) उस नए दृश्य नियंत्रक पर क्लिक करें (नई चीज़ जो Xcode आपके लिए कहीं सफेद क्षेत्र पर बनाई गई है, न कि आपके दृश्य के अंदर की चीज़ ) … और, क्लास को बदलें!

यह वास्तव में सरल है

हो गया।


यहाँ एक ही बात नेत्रहीन समझाया है

(A) पर कंटेनर दृश्य देखें

नियंत्रक को सूचना दें (B)

एक कंटेनर दृश्य और संबंधित दृश्य नियंत्रक दिखाता है

बी पर क्लिक करें (वह बी – नहीं ए!)

शीर्ष सही पर निरीक्षक के पास जाओ सूचना यह कहते हैं "UIViewController"

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

इसे अपने स्वयं के कस्टम वर्ग में बदलें, जो एक UIViewController है

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

तो, मेरे पास एक स्विफ्ट क्लास Snap जो एक UIViewController है I

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

तो जहां "IViewViewController" इंस्पेक्टर में "स्नैप" में टाइप किया गया है

(हमेशा की तरह, एक्सकोड "स्नैप" को स्वत: पूर्ण करेगा जैसा कि आप "स्नैप …" टाइप करना शुरू करते हैं।)

यह सब वहाँ है – आप कर रहे हैं


कंटेनर व्यू बदलने के लिए – एक टेबल व्यू में कहें।

इसलिए जब आप एक कंटेनर दृश्य जोड़ने के लिए क्लिक करते हैं, तो ऐप्पल आपको स्टोरीबोर्ड पर बैठे एक लिंक वाले दृश्य नियंत्रक देता है।

ऐसा होने पर (2017): यह डिफ़ॉल्ट रूप से एक UIViewController बनाता है

यह मूर्खतापूर्ण है: आपको यह पूछना चाहिए कि आपको किस प्रकार की ज़रूरत है उदाहरण के लिए, अक्सर आपको एक तालिका दृश्य की आवश्यकता होती है। यहां कुछ अलग करने के लिए इसे बदलने का तरीका बताया गया है:

लेखन के समय, Xcode आपको डिफ़ॉल्ट रूप से एक UIViewController देता है। मान लें कि आप इसके बजाय एक UICollectionViewController चाहते हैं:

(i) अपने दृश्य में एक कंटेनर दृश्य खींचें स्टोरीबोर्ड पर UIViewController को देखो जो Xcode आपको डिफ़ॉल्ट रूप से देता है

(ii) स्टोरीबोर्ड के मुख्य सफेद क्षेत्र पर कहीं भी एक नया UICollectionViewController खींचें।

(iii) अपने दृश्य के अंदर कंटेनर दृश्य पर क्लिक करें कनेक्शन इंस्पेक्टर पर क्लिक करें नोटिस एक "ट्रिगरेज सेगुए" है "ट्रिगरेड सेगुए" पर माउस और नोटिस करें कि Xcode सभी अवांछित UIViewController को हाइलाइट करता है।

(iv) वास्तव में ट्रिगर किए गए सेग्यू को हटाने के लिए "x" पर क्लिक करें।

(v) उस ट्रिगेज्रेड सेग्यू से खींचें (देखेंडिडलोड केवल एकमात्र विकल्प है) स्टोरीबोर्ड में अपने नए UICollectionViewController पर खींचें चलें और एक पॉप-अप दिखाई देता है। आपको एंबेड का चयन करना होगा।

(vi) बस सभी अवांछित UIViewController हटाएं हो गया।

लघु संस्करण: अवांछित UIViewController हटाएँ स्टोरीबोर्ड पर एक नया UICollectionViewController रखें। नियंत्रण-खींचें: कंटेनर दृश्य के कनेक्शन – ट्रिगर सेग्यू – अपने नए नियंत्रक के लिए दृश्यडायडलोड करें। पॉपअप पर "एम्बेड करें" का चयन करना सुनिश्चित करें


टेक्स्ट पहचानकर्ता दर्ज कर रहा है …

आप इनमें से एक "स्क्वेयर में स्क्वायर" मेसोनिक सिग्नल चीजों में से एक होंगे : यह दृश्य नियंत्रक के साथ अपने कंटेनर व्यू को जोड़ने वाले "बेंडी लाइन" पर है।

"मेसोनिक सिग्नल" चीज सीग्यू है

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

"मेसोनिक प्रतीक" चीज़ पर क्लिक करके सेग्यू का चयन करें

अपने अधिकार को देखो

आप segue के लिए एक पाठ पहचानकर्ता में टाइप करना आवश्यक है

आप नाम पर फैसला करते हैं यह कोई भी टेक्स्ट स्ट्रिंग हो सकता है एक समझदार विकल्प अक्सर "segueClassName" है

यदि आप उस पैटर्न का पालन करते हैं, तो आपके सभी segues को segueClockView, seguePersonSelector, segueSnap, segueCards और इतने पर कहा जाएगा।

अगला, आप उस टेक्स्ट पहचानकर्ता का उपयोग कहाँ करते हैं?


बाल नियंत्रक से कनेक्ट करने के लिए …

फिर, पूरे दृश्य के ViewController में, कोड में निम्नलिखित करें

मान लें कि आपके पास इस दृश्य में तीन कंटेनर दृश्य हैं प्रत्येक कंटेनर दृश्य में एक अलग नियंत्रक है, "स्नैप", "घड़ी" और "अन्य" कहें।

नवीनतम स्विफ्ट 3 सिंटैक्स (2017)

 var snap:Snap? var clock:Clock? var other:Other? override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if (segue.identifier == "segueSnap") { snap = (segue.destination as! Snap) } if (segue.identifier == "segueClock") { clock = (segue.destination as! Clock) } if (segue.identifier == "segueOther") { other = (segue.destination as! Other) } } 

यह इत्ना आसान है। आप prepareForSegue कॉल का उपयोग करते हुए नियंत्रकों को संदर्भित करने के लिए एक चर कनेक्ट करते हैं


माता पिता को 'अन्य दिशा' में कैसे कनेक्ट किया जाए …

कहते हैं कि आप "इन" नियंत्रक हैं जो आपने एक कंटेनर दृश्य (उदाहरण में "स्नैप") में डाल दिया है।

यह आपके ऊपर "बॉस" दृश्य नियंत्रक (उदाहरण के लिए "डैश") पाने के लिए एक भ्रामक हो सकता है। सौभाग्य से, यह आसान है:

 // Dash is the overall scene. // Here we are in Snap. Snap is one of the container views inside Dash. class Snap { var myBoss:Dash? override func viewDidAppear(_ animated: Bool) { // MUST be viewDidAppear super.viewDidAppear(animated) myBoss = self.parent as? Dash } 

महत्वपूर्ण: केवल viewDidAppear या बाद में से काम करता है। viewDidLoad में काम नहीं करेगा viewDidLoad

हो गया।


महत्वपूर्ण: केवल कंटेनर दृश्यों के लिए काम करता है

महत्वपूर्ण उन्नत टिप: मत भूलो, केवल कंटेनर के विचारों के लिए काम करता है

स्टोरीबोर्ड पहचानकर्ताओं के साथ ये दिन, यह स्क्रीन पर नए विचारों को पॉप करने के लिए सामान्य रूप से (बल्कि एंड्रॉइड डेवलपमेंट में) पॉप-अप है तो, मान लें कि उपयोगकर्ता कुछ संपादित करना चाहता है …

  // let's just pop a view on the screen. // this has nothing to do with container views // let e = ...instantiateViewController(withIdentifier: "Edit") as! Edit e.modalPresentationStyle = .overCurrentContext self.present(e, animated: false, completion: nil) 

कंटेनर दृश्य का उपयोग करते समय, यह गारंटी दी जाती है कि डैश स्नैप का मूल दृश्य नियंत्रक होगा।

हालांकि, जब आप तत्काल ViewController का उपयोग करते हैं तो यह अनिवार्य रूप से मामला नहीं है

बहुत confusingly, आईओएस में माता पिता के दृश्य नियंत्रक वर्ग जो इसे instantiated से संबंधित नहीं है (यह वही हो सकता है, लेकिन आमतौर पर यह वही नहीं है।) self.parent पैटर्न केवल कंटेनर के विचारों के लिए हैं।

(तत्काल दृश्यकंट्रोलर पैटर्न में समान परिणाम के लिए, आपको एक प्रोटोकॉल और एक प्रतिनिधि का उपयोग करना होगा, यह याद रखना कि प्रतिनिधि एक कमजोर लिंक होगा।)


तैयारी के लिए खराब नाम दिया …

यह ध्यान देने योग्य है कि "prepareForSegue" एक बहुत बुरा नाम है!

"prepareForSegue" का दो उद्देश्यों के लिए उपयोग किया जाता है: कंटेनर के दृश्य लोड करना, और, दृश्यों के बीच segueing

लेकिन व्यवहार में, आप बहुत ही दुर्लभ दृश्यों के बीच में रहते हैं! जबकि लगभग हर ऐप में कई, कई, कंटेनर विचारों को पाठ्यक्रम के मामले के रूप में है।

यह बहुत अधिक समझ में आता है अगर "prepareForSegue" को "loadingContainerView" जैसा कुछ कहा जाता था


एक से अधिक…

एक सामान्य स्थिति यह है: आपके पास स्क्रीन पर एक छोटा क्षेत्र है, जहां आप एक अलग दृश्य नियंत्रक में से एक को दिखाना चाहते हैं। उदाहरण के लिए, चार विगेट्स में से एक

ऐसा करने का सबसे सरल तरीका: चार अलग-अलग कंटेनर विचार हैं जो सभी समान समान क्षेत्र में बैठे हैं । आपके कोड में, बस चारों को छिपा दें और जिस पर आप दिखाना चाहते हैं उसे चालू करें

स्टोरीबोर्ड पर, एक खाली "धारक" UIView है, जिसमें सिर्फ चार कंटेनर दृश्य हैं। आप तब "आकार" या "होल्डर" को स्थानांतरित करके आकार या चार बार एक साथ ले जा सकते हैं। आपके कोड में, बस चार UIView आउटलेट, प्रत्येक कंटेनर दृश्यों के लिए एक है। उपरोक्त कोड को कॉपी और पेस्ट करें, चार निहित व्यू नियंत्रक को कनेक्ट करने के लिए, "बच्चे नियंत्रक से कैसे जुड़ें"


नोट – स्टोरीबोर्ड संदर्भ पहुंचें!

जैसा कि SimplGy "IOS 9 के स्टोरीबोर्ड संदर्भों के नीचे बताता है , कंटेनर विचारों को और भी अधिक भयानक बनाते हैं। आप अपने पुन: प्रयोज्य दृश्य (नियंत्रक) को परिभाषित कर सकते हैं जहाँ आप चाहें और इसे किसी भी कंटेनर दृश्य से एकाधिक, मॉड्यूलर स्टोरीबोर्ड में संदर्भित कर सकते हैं।"

ध्यान दें कि – भ्रामक रूप से – अक्सर आज आप कंटेनर विचारों से परेशान नहीं होते!

आप कई परिस्थितियों में केवल instantiateViewController#withIdentifier

लेकिन ध्यान दें कि "मिलेगा" के बारे में। कंटेनर के विचारों का संपूर्ण मुद्दा यह है कि आप मूल-चेन की तुरंत और आसानी से आश्वस्त हैं।

अगर आप instantiateViewController#withIdentifier साथ एक स्टोरीबोर्ड संदर्भ का प्रयोग करके instantiateViewController#withIdentifier साथ जाते हैं, तो आपको एक प्रोटोकॉल और प्रतिनिधि के साथ घूमना पड़ता है (याद रखना कि प्रतिनिधि कमजोर लिंक होगा) लेकिन फिर आप इसे आसानी से कहीं भी "मक्खी पर" का उपयोग कर सकते हैं।

"फिक्स्ड" का प्रयोग करते हुए इसके विपरीत, कंटेनर व्यू बहुत ही सरल है, और आप ऊपर बताए गए अनुसार माता-पिता और बच्चे के बीच तुरंत झुकाते हैं।

मैं दो समस्याएं देखता हूं सबसे पहले, जब से आप स्टोरीबोर्ड में नियंत्रक बना रहे हैं, आपको तत्काल वीवीयूआई नियंत्रकविद्युतकर्ता के साथ instantiateViewControllerWithIdentifier: करना चाहिए instantiateViewControllerWithIdentifier: initWithNibName:bundle: । दूसरा, जब आप दृश्य को एक सबव्यू के रूप में जोड़ते हैं, तो आपको इसे फ्रेम देना चाहिए इसलिए,

 - (void)viewDidLoad { [super viewDidLoad]; self.aboutVC = [self.storyboard instantiateViewControllerWithIdentifier:@"aboutVC"]; // make sure you give the controller this same identifier in the storyboard [self addChildViewController:self.aboutVC]; [self.aboutVC didMoveToParentViewController:self]; self.aboutVC.view.frame = self.utilityView.bounds; [self.utilityView addSubview:self.aboutVC.aboutView]; }