स्विफ्ट: कस्टम व्यूकंट्रोलर इनिशियलाइज़र


87

आप UIViewControllerस्विफ्ट में उपवर्गों में कस्टम इनिशियलाइज़र कैसे जोड़ते हैं ?

मैंने एक उप-वर्ग बनाया है UIViewControllerजो कुछ इस तरह दिखता है:

class MyViewController : UIViewController
{
    init(leftVC:UIViewController, rightVC:UIViewController, gap:Int)
    {
        self.leftVC = leftVC;
        self.rightVC = rightVC;
        self.gap = gap;

        super.init();

        setupScrollView();
        setupViewControllers();
    }
}

जब मैं इसे चलाता हूं तो मुझे एक घातक त्रुटि मिलती है:

घातक त्रुटि: कक्षा 'MyApp.MyViewController' के लिए अनइम्प्लीमेंटेड इनिशियलाइज़र 'इनिट (nibName: बंडल :)' का उपयोग

मैंने पढ़ा है कि जब एक कस्टम इनिशियलाइज़र को जोड़ने पर भी ओवरराइड करना होता है init(coder aDecoder:NSCoder)तो चलो इसे ओवरराइड करते हैं initऔर देखते हैं कि क्या होता है:

override init(coder aDecoder: NSCoder)
{
    super.init(coder: aDecoder);
}

अगर मैं इसे जोड़ता हूं, तो Xcode शिकायत करता है कि self.leftVC is not initialized at super.init call। इसलिए मुझे लगता है कि समाधान भी नहीं हो सकता है। इसलिए मुझे आश्चर्य है कि मैं ViewControllerस्विफ्ट में एक उपवर्ग के लिए कस्टम इनिशियलाइज़र्स को ठीक से कैसे जोड़ सकता हूं (चूंकि ऑब्जेक्टिव-सी यह एक समस्या नहीं लगती है)?


आप अपने को कैसे त्वरित करने की कोशिश कर रहे हैं MyViewController?
माइक पोलार्ड 12

ViewDidLoad () में सब कुछ तुरंत क्यों न करें, वहां आप उन्हें उसी तरह से इनिशियलाइज़ कर सकते हैं, जैसा आप चाहते हैं
tudoricc

@MikePollard with dualViewCtrl = DualViewCtrl (लेफ्टव्यू: एल, राइटवीवी: आर, गैप: 50) ... मुझे पहले से ही पता चला है कि मुझे initWithNib initializer का उपयोग करने की आवश्यकता है।
बैडमिंटनकैट

3
@tudoricc क्योंकि अक्सर आप ऐसे उदाहरण गुण चाहते हैं जो प्रारंभ में दिए गए मापदंडों के साथ सुरक्षित रूप से आरंभिक होते हैं। आप ऐसा नहीं कर सकते जब से ViewDidLoad में तब से यह गारंटी नहीं दी जाएगी कि जरूरत पड़ने पर गुण उपलब्ध हैं।
बैडमिंटनकैट

मुझे खेद है कि मेरे दिमाग में बस एक इनिशियलाइज़र के रूप में viewDidLoad () दिखाई दे रहा है। स्पष्टीकरण के लिए
धन्यवाद

जवाबों:


124

उसे हल कर लिया! एक को नामित इनिशियलाइज़र को कॉल करना होगा जो इस मामले में निबनेम के साथ इनिट है, जाहिर है ...

init(leftVC:UIViewController, rightVC:UIViewController, gap:Int)
{
    self.leftVC = leftVC
    self.rightVC = rightVC
    self.gap = gap

    super.init(nibName: nil, bundle: nil)

    setupScrollView()
    setupViewControllers()
}

31
उन बदसूरत अर्ध कॉलोनों से छुटकारा पाएं :)
MobileMon

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

25
IMHO, यदि आप एक चरित्र टाइप करते हैं और यह संकलित बाइनरी को प्रभावित नहीं करता है, तो आपको इसे टाइप नहीं करना चाहिए :)
सैम सॉफिस

33
@SamSoffes ताकि आप (अतिरिक्त) व्हाट्सएप का उपयोग बिल्कुल न करें? और आप एकल वर्ण होने के लिए सभी प्रतीकों को मानते हैं?
विक्टर जलकेन

8
यह चर्चा मुझे सिलिकॉन वैली के स्थानों बनाम टैब की याद दिलाती है
आरोन

13

अधिक सामान्य UIViewController के लिए आप इसे Swift 2.0 के रूप में उपयोग कर सकते हैं

init() {
    super.init(nibName: nil, bundle: nil)
}

11

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

convenience required init(coder aDecoder: NSCoder)
{
    //set some defaults for leftVC, rightVC, and gap
    self.init(leftVC, rightVC, gap)
}

चूँकि init:leftVC:rightVC:gapएक निर्दिष्ट इनिशियलाइज़र है, आप init:coderइसे एक इनिशियलाइज़र इनिलाइज़र बनाकर लागू करने की आवश्यकता को पूरा कर सकते हैं, जो आपके निर्दिष्ट इनिलाइज़र को कॉल करता है।

इससे बेहतर हो सकता है

override init(coder aDecoder: NSCoder)
{
    super.init(coder: aDecoder);
}

क्योंकि यदि आपको कुछ गुणों को इनिशियलाइज़ करने की आवश्यकता है, तो आपको उन्हें फिर से लिखना होगा।


8

स्विफ्ट 5

यदि आप कस्टम इनिशियलाइज़र लिखना चाहते हैं UIViewControllerजिसके साथ इनिशियलाइज़ किया गया हैstoryBoard.instantiateViewController(withIdentifier: "ViewControllerIdentifier")

आप केवल Optionalगुणों के लिए कस्टम इनिशियलाइज़र लिख सकते हैं।

class MyFooClass: UIViewController {
    var foo: Foo?

    init(with foo: Foo) {
        self.foo = foo
        super.init(nibName: nil, bundle: nil)
    }

    public required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.foo = nil
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.