घातक त्रुटि: वर्ग के लिए अयोग्य प्रवर्तक 'इनिट (कोडर :)' का उपयोग


156

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

घातक त्रुटि: वर्ग के लिए अकल्पित इनिशियलाइज़र 'इनिट (कोडर :)') का उपयोग

यह एक कोड है:

import UIKit

class TestViewController: UIViewController {

    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        // Custom initialization
    }

    override func viewDidLoad() {
        super.viewDidLoad()
              // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    /*
    // #pragma mark - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */
}

कृपया कुछ सुझाव दें

जवाबों:


207

मुद्दा

यह init?(coder aDecoder: NSCoder)लक्ष्य पर इनिशियलाइज़र की अनुपस्थिति के कारण होता है UIViewController। इस विधि की आवश्यकता है क्योंकि यह UIViewControllerएक UIStoryboardकॉल से तत्काल है।

यह देखने के लिए कि हम कैसे एक UIViewControllerसे आरंभ करते हैं UIStoryboard, कृपया यहां देखें

यह उद्देश्य-सी के साथ समस्या क्यों नहीं है?

क्योंकि ऑब्जेक्टिव-सी स्वचालित रूप से सभी आवश्यक UIViewControllerइनिशियलाइज़र को विरासत में मिला है।

स्विफ्ट इनिशियलाइज़र्स को स्वचालित रूप से विरासत में क्यों नहीं लेता है?

डिफ़ॉल्ट रूप से स्विफ्ट सुरक्षा के कारण इनिशियलाइज़र को विरासत में नहीं मिलती है। लेकिन यह सुपरक्लास से सभी इनिशियलाइजर्स को इनहेरिट करेगा, यदि सभी प्रॉपर्टीज की वैल्यू (या ऑप्शनल) हो और सबक्लास ने किसी भी इनिशियलाइज्ड इनिशियलाइजर्स को परिभाषित न किया हो।


उपाय

1. सबसे पहले

init?(coder aDecoder: NSCoder)लक्ष्य पर व्यक्तिगत रूप से लागूUIViewController

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

2. दूसरा

init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)अपने लक्ष्य पर हटाने UIViewControllerसे सुपरक्लास के सभी आवश्यक इनिशियलाइज़र विरासत में मिल जाएंगे, जैसा कि डेव वुड ने नीचे दिए गए उत्तर पर बताया था



4
इसके लिए धन्यवाद। त्वरित अनुसरण करें ... जब आप TableViewController फ़ाइल बनाते हैं, तो Xcode में पहले से ही शामिल है init(style: UITableViewStyle) { super.init(style: style) // Custom initialization } कि हमारे पास दो init फ़ंक्शन क्यों हो सकते हैं ? और किसी भी विचार क्यों Apple डिफ़ॉल्ट रूप से 2 इनिट शामिल नहीं है?
ट्रेवर मैकेंड्रिक

इसका iOS 7 या iOS 8 से कोई लेना-देना नहीं है। यह स्विफ्ट इंट्रस्टीजेटर्स के विरासत के तरीके से जुड़ा है!
सुल्तान

सार्वजनिक init (देखें: UIViewController, फ्रेम: CGRect) {self.viewController = view self.imageName = "" self.actionName = "" super.init (फ्रेम: फ्रेम)}
स्कैपी

पहली विधि काम की! मेरी गतिशील तालिका अंत में गतिशील कोशिकाओं से भरी हुई है !!! सभी क्योंकि रेखा fatalError( "init(coder:) has not been implemented")ने मेरा ऐप रोक दिया था ।
जोस मैनुअल अबर्का रॉड्रिग्ज

25

इसके अलावा @ 3r1d का दूसरा विकल्प अपनी कक्षा से निम्नलिखित init पद्धति को निकालना है:

init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    // Custom initialization
}

उस init पद्धति को शामिल करते हुए, उप वर्ग init(coder aDecoder: NSCoder!)को अपने सुपर क्लास से विरासत में मिलने से रोकता है । इसे शामिल न करने से, आपकी कक्षा दोनों को विरासत में मिलेगी।

नोट: अधिक विवरण के लिए WWDC 2014 सत्र 403 "इंटरमीडिएट स्विफ्ट" के बारे में 33:50 अंक देखें।


सत्र 403 पर स्पष्टीकरण को इंगित करने के लिए धन्यवाद। लेकिन यदि बाल वर्ग में केवल सुविधा आरंभीकरण है तो यह सुपर क्लास आरंभीकरण को सही करेगा?
जैमल्टेज़

1
हाँ। यदि आप अपने स्वयं के निर्दिष्ट init तरीके प्रदान करते हैं (जो सुपर इनिट्स कॉल करते हैं) तो आप केवल सुपर क्लास इनिट विधियों को विरासत में लेने से रोकते हैं। फिर आपको निर्दिष्ट करना होगा कि कौन से सुपर इनिट्स को अपनी कक्षा में जोड़कर समर्थन करना है और केवल सुपर संस्करण को कॉल करना है (जैसा कि @ 3r1d के उत्तर में)
डेव वुड

आपके बाल वर्ग में केवल सुविधा init () बिना (निर्दिष्ट) init () होने से संकलन त्रुटि हो जाएगी। ऐसा इसलिए है क्योंकि सुविधा init () फ़ंक्शन को self.init () फ़ंक्शन परिभाषा के अंदर कॉल करना चाहिए।
ओमी

@narumolPug गलत है। आपको निर्दिष्ट initविधियों को शामिल करने की आवश्यकता नहीं है । आपका बच्चा वर्ग उन्हें सुपर क्लास से विरासत में मिलेगा। आप अभी भी कॉल कर सकते हैं self.init()जो सुपर संस्करण को निष्पादित करेगा।
डेव वुड

वीडियो का सटीक क्षण यहां पाया जा सकता है youtu.be/W1s9ZjDkSN0?t=2030
Honey

10

समान समस्या वाले लोगों के लिए स्विफ्ट के साथ UICollectionViewCells, अपने कस्टम UICollectionViewCellवर्ग को सुझाव दिया गया @ 3r1d कोड जोड़ें और व्यू कंट्रोलर को न देखें:

init(coder aDecoder: NSCoder!)
{
    super.init(coder: aDecoder)
}

आप किस UICollectionViewCell का जिक्र कर रहे हैं? कोडर के साथ Init
व्यू कॉन्ट्रोलर

इस उदाहरण में नहीं, लेकिन अगर किसी को इससे कोई समस्या है (मैंने किया है) ... यदि आप अपने कस्टम सेल में एक UICollectionViewController का उपयोग करने की कोशिश करते हैं, तो .swift फ़ाइल में आपको कोडर के साथ init डालने की आवश्यकता होती है।
निक याप

2
आपको इस कोड को हर बार जोड़ना होगा जब आप तात्कालिकता के इस तरीके का उपयोग करते हैं stackoverflow.com/questions/24035984/…
E-Riddie

3

स्विफ्ट में कोड की आवश्यकता वाले लोगों के लिए:

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

[संपादित करें] यह स्विफ्ट के पुराने संस्करण के लिए था। संभवतः अब काम नहीं करता है।


3

मुझे प्रोग्राममैटिक कलेक्शन व्यू सेल में यह समस्या थी और हालांकि ऑप एक vc के बारे में पूछ रहा है, मैं अभी भी इस सवाल पर उतरा जब कोई जवाब खोज रहा था। मेरे लिए मुद्दा यह था कि मेरे पास क्या था

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

लागू किया गया तो शीर्ष उत्तर काम नहीं किया। सेल में जो मेरे पास नहीं था वह इनिशियलाइज़र था:

// my programmatic cell was missing this
override init(frame: CGRect) {
    super.init(frame: frame)
}

एक बार मैंने इसे जोड़ा तो त्रुटि दूर हो गई


1

आंतरिक तंत्र को ठीक बनाने के लिए कुछ तरीकों को जोड़ने के बजाय, मैं अपनी विशेषताओं को @ आलसी के रूप में परिभाषित करने के साथ जाऊंगा और उन्हें कक्षा के दायरे में सही करूँगा।


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