सवाल IBOutlet शून्य है, लेकिन यह स्टोरीबोर्ड, स्विफ्ट में जुड़ा हुआ है


स्विफ्ट 1.1 और एक्सकोड 6.2 का उपयोग करना।

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

लेकिन रन टाइम पर, ये गुण शून्य (चित्रा बी) हैं। भले ही मैंने आश्वस्त किया है कि मैंने इंटरफ़ेस बिल्डर में आउटलेट कनेक्ट किए हैं।

विचार:

  • क्या यह संभव है क्योंकि मैं उप-वर्ग के उप-वर्ग का उपयोग कर रहा हूं, शुरुआत के साथ कुछ गड़बड़ है? मैं किसी भी प्रारंभकर्ता को ओवरराइड नहीं कर रहा हूं
  • awakeFromNib: किसी कारण से नहीं बुलाया जा रहा है
  • शायद यह सबव्यूव्यू पर सबव्यूज से कनेक्ट नहीं हो रहा है

चीजें मैंने कोशिश की है:

  • मेल मिलाना @IBOutlet और स्टोरीबोर्ड आइटम प्रकार बिल्कुल (इसके बजाए UIView)
  • संपत्ति और आउटलेट हटाना और उन्हें फिर से जोड़ा

Figure A

चित्रा ए *

Figure B

चित्रा बी

* अस्पष्ट कोड में Figure A है:

@IBOutlet private var annotationOptionsView: UIView!
@IBOutlet private var arrivingLeavingSwitch: UISegmentedControl!

धन्यवाद।


76
2018-03-28 19:09


मूल


क्यों नहीं बदला! सेवा मेरे ? - Shaan Singh
clearView शून्य है क्योंकि स्टोरीबोर्ड से लिंक नहीं है (एक छेद के साथ कोड के बाईं ओर स्थित सर्कल देखें, जो इंगित करता है कि लिंक नहीं है), स्क्रीनशॉट में मैं एनोटेशनऑशन व्यू की घोषणा नहीं देख सकता। - Javier Flores Font
@JavierFloresFont: clearView मैं शून्य होने की उम्मीद करता हूं। यह कुछ ऐसा है जो मैंने अभी तक refactor करने के लिए किया है। आकृति ए के लिए फुटनोट भी देखें @ शहानसिंह यह होना चाहिए! क्योंकि स्टोरीबोर्ड से कनेक्शन रनटाइम पर सेट (माना जाना चाहिए) और शून्य नहीं होना चाहिए। - Stefan Arambasich
यह दृश्य नियंत्रक कैसे लोड हो जाता है? हमें वह कोड दिखाएं जो इसके लिए पूछता है, या उस से जुड़े सिगू का वर्णन करता है। - rob mayoff
यह सही स्टोरीबोर्ड प्राप्त कर रहा है: let vc = UIStoryboard(name: "LocationPickerModal", bundle: nil) .instantiateViewControllerWithIdentifier("LocationPickerModalViewController") as LocationPickerModalViewController - Stefan Arambasich


जवाब:


आम तौर पर ऐसा इसलिए होता है क्योंकि आपके व्यू कंट्रोलर ने अभी तक अपना दृश्य पदानुक्रम लोड नहीं किया है। एक व्यू कंट्रोलर केवल कुछ दृश्य भेजता है जब कुछ इसे भेजता है view संदेश। यह प्रणाली तब होती है जब वास्तव में स्क्रीन पर दृश्य पदानुक्रम डालने का समय होता है, जो चीजों के बाद होता है prepareForSegue:sender: तथा viewWillAppear: लौट चुका है।

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

आप वीसी को अपने दृश्य पदानुक्रम को लोड करके मजबूर कर सकते हैं self.view


102
2018-03-28 20:41



यह तब होता है जब viewWillAppear: कहा जाता है, पहली बार मैं उस आउटलेट के साथ कुछ भी करता हूं। दृश्य तक पहुंचने से मेरे लिए कुछ भी नहीं होता है। अभी भी शून्य - Stefan Arambasich
धन्यवाद! यह मेरे लिए भी काम किया। var v = viewcontroller.view; दृश्य पदानुक्रम लोड करने के लिए मजबूर किया। अच्छा थोड़ा चाल! ;) - Yordi Uytersprot
@YordiUytersprot आप इस लाइन को कहां रखेंगे? - Async-
खैर, अगर आप व्यू कंट्रोलर को तुरंत चालू करते हैं: vc = self.storyboard? .InstantianteViewControllerWithIdentifier ("StoryboardIDfromVC") को दें? CustomVC; चलो देखते हैं = vc.view; // अभी, आप यहां कस्टमवीवी से आईबीओटलेट तक पहुंच सकते हैं .. vc.customTextField.text = "लालला"; उम्मीद है कि यह आपकी मदद करता है! :) - Yordi Uytersprot
मैं इस मुद्दे में अक्सर दौड़ता हूं और यह हमेशा वही रहता है। और मैं हमेशा पहले पांच मिनट या तो आश्चर्य करता हूं ... ;-) - cybergen


क्या आपने उत्पाद> क्लीन चलाने की कोशिश की है। मेरे लिए एक बहुत ही समान समस्या हल हो गई।


25
2018-04-06 01:23



मैंने किया। क्षमा करें, मेरा जवाब चिह्नित करने के लिए था। मैंने हटा दिए जाने के बाद ही काम करना शुरू कर दिया DerivedData परियोजना के लिए फ़ोल्डर। - Stefan Arambasich
मेरे दृश्य पदानुक्रम के बीच में केवल दो आउटलेट शून्य थे .. उत्पाद -> स्वच्छ मेरे लिए काम किया! - Rikco
मैं खुशी से मदद कर सकता है - ThottChief
धन्यवाद, यह काम करता है, मैं उपयोगकर्ता उत्पाद -> स्वच्छ बिल्ड फ़ोल्डर ... - Ivan
ओबीजे सी, बस मेरे लिए काम की गई परियोजना की सफाई ... विश्वास नहीं कर सकता एक घंटे से अधिक समय बिताया और परियोजना को साफ करने के बारे में भी सोचा नहीं: / लेकिन धन्यवाद !! - greenhouse


क्या आपने स्टोरीबोर्ड या एनआईबी से अपने व्यू कंट्रोलर को तुरंत चालू किया था, या आपने इसे सीधे प्रारंभकर्ता के माध्यम से तुरंत चालू किया था?

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


14
2018-03-28 21:49



मैं एक बना रहा हूँ UIStoryboard उदाहरण और कॉलिंग instantiateViewControllerWithIdentifier इस पर। - Stefan Arambasich


स्टोरीबोर्ड उस और यूआई चीजों को पहचान नहीं रहा था जिसे मैंने इसमें जोड़ा था। रन टाइम पर सभी संदर्भ शून्य थे। इसलिए मैंने अपना व्युत्पन्न डेटा फ़ोल्डर साफ़ कर दिया और फिर उन कनेक्शनों ने फिर से काम किया।


12
2018-03-29 02:04



यह जवाब है। मैंने इसे थोड़ी देर के लिए लड़ा, बिल्ड फ़ोल्डर और सब कुछ साफ कर दिया। मेरे मामले में, में viewDidLoad() सभी कनेक्शन बनाए गए थे, लेकिन अंदर viewWillAppear() उनमें से लगभग सभी थे nil (कभी-कभी एक या दो अभी भी जुड़े हुए थे)। मैंने सब कुछ करने की कोशिश की और आखिरकार व्युत्पन्न डेटा फ़ोल्डर हटा दिया, पुनर्निर्मित किया, और सब ठीक था। - ruttopia
3 साल के बाद भी, एक्सकोड 9.2 में अभी भी एक ही देवता है। बहुत बहुत धन्यवाद। - Kemal Can Kaynak


मेरे मामले में, ऐसा इसलिए हुआ क्योंकि मैं ओवरराइड करता हूं loadView मेरे ViewController subclass में विधि, लेकिन जोड़ने के लिए भूल गए [super loadView]

-(void)loadView {
// blank
}

जब आप ओवरराइड करते हैं loadView विधि, आपके उपन्यासों को ध्यान में रखना आपकी ज़िम्मेदारी है। चूंकि आप इसे ओवरराइड करते हैं, इंटरफ़ेस बिल्डर के विचारों को कोको ऑब्जेक्ट्स में कनवर्ट करने का मौका नहीं मिलता है और इस प्रकार आउटलेट शून्य रहते हैं।

यदि आप अपने व्यू कंट्रोलर उपclass में loadView को लागू करते हैं, तो यह आपकी ज़िम्मेदारी यूआई तत्वों को स्टोरीबोर्ड / xib से कोड में लोड करती है।

या बस कॉल करें

[super loadView];

ताकि सुपरक्लास को स्टोरीबोर्ड / xib को कोड में लोड करने का मौका मिले।


10
2018-01-13 09:38





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


8
2017-11-26 22:16



तुम सही हो। मैंने विस्तार से स्विफ्ट प्रोग्रामिंग भाषा में एआरसी गिनती सामग्री पढ़ी। मुझे कारण नहीं मिल रहा है, क्यों आईबीओलेट कमजोर संपत्ति अभी भी शून्य है। अंत में, मैं '@IBOutlet स्विफ्ट नील' के लिए Google हूं और SO में अपना उत्तर पाता हूं। फिर मैंने लाइन एक्सकोड टेम्पलेट को चिह्नित किया 'view.collectionView! .RegisterClass' viewDidLoad में जोड़ा गया। फिर, यह काम करता है। तुम मेरी जिंदगी बचाओ - charles.cc.hsu


आप कॅाल कर सकते हैं controller.view IBOutlets को प्रारंभ करने के लिए दृश्य को लोड करने के लिए मजबूर करने के लिए, तो आप मान असाइन करने में सक्षम होंगे।

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if (segue.identifier == "identifier") {
        let controller = segue.destinationViewController as! YourController
        let _ = controller.view //force to load the view to initialize the IBOutlets

        controller.your_IBOutlet_property = xxx
        ...
        controller.delegate = self
    }
}

6
2017-08-08 03:12





मेरे लिए, यह तब हुआ जब मैंने गलती से मेरे व्यू कंट्रोलर की कक्षा घोषित की

class XYZViewController: UINavigationController {
}

(यानी ए के रूप में UINavigationController नहीं UIViewController)।

एक्सकोड इस गलती पर नहीं उठाता है, कक्षा ठीक से निर्माण करती है, और जैसे कार्यों को ओवरराइड करता है viewDidLoad, viewWillAppear, आदि सभी सही ढंग से काम करते हैं। लेकिन इनमें से कोई भी नहीं IBOutletजुड़ा हुआ है

घोषणा को बदलना

class XYZViewController: UIViewController {
}

इसे पूरी तरह से तय किया।


6
2017-07-15 14:50



सुपर! धन्यवाद। मेरे मामले में मैं स्टोरीबोर्ड से UINavigationController को हटाने के बाद कोड को ठीक करना भूल गया। - Vitaliy A


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


5
2017-10-15 19:05





मुझे हाल ही में इस समस्या का सामना करना पड़ रहा है! मेरा विचार यहाँ है। समस्या आपके बारे में स्टोरीबोर्ड या कोई लिंक समस्या नहीं है। यह है कि आप अपना व्यू कंट्रोलर कैसे शुरू करते हैं। विशेष रूप से जब आप स्विफ्ट का उपयोग कर रहे हैं। (जब आप कक्षा फ़ाइल बनाते हैं तो संपादक में कुछ भी नहीं है)

बस उपयोग करके init() सुपर क्लास से स्टोरी बोर्ड के साथ काम करने वाली किसी चीज को शुरू नहीं किया जा सकता है। तो आपको क्या करना है ViewController के प्रारंभिककरण को बदल रहा है। बदलने के let XXViewController = XXViewController()  द्वारा let XXViewController = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("XXViewController") as! XXViewController यह प्रोग्राम को XXViewController खोजने के लिए स्टोरीबोर्ड पर जाने और सभी को शुरू करने के लिए कहता है IBOutlet अपने स्टोरीबोर्ड में।

आशा है कि यह मदद ~ जीएल


4
2017-11-03 08:29



यह मुद्दा नहीं था - Stefan Arambasich