2015-06-06 9 views
33

में UIViewController के init विधियों को कैसे लिखें I निम्नलिखित UIViewController क्लास में init विधि जोड़ने में असमर्थ हूं। मुझे init विधि में कुछ कोड लिखने की जरूरत है। क्या मुझे init (कोडर) विधि लिखनी है? यहां तक ​​कि जब मैं कोडर और डिकोडर विधियों को जोड़ता हूं तब भी मुझे त्रुटियां मिलती हैं। मैंने बिना किसी पैरामीटर के इनिट विधि का उपयोग करने का भी प्रयास किया लेकिन यह भी काम नहीं कर रहा है।स्विफ्ट

class ViewController: UIViewController { 

    var tap: UITapGestureRecognizer? 

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { 
     super.init(nibName: nil, bundle: nil) 
     tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:")) 
    } 

... 
... 
} 

अगर मैं पैरामीटर के बिना super.init() विधि त्रुटि है कॉल "सुपर वर्ग के एक नामित प्रारंभकर्ता कॉल करना होगा" और अगर मैं पैरामीटर निब गुजरती हैं और बंडल तो त्रुटि "है आवश्यक प्रारंभकर्ता init (सांकेतिक शब्दों में बदलनेवाला) "।

जब भी मैं init (कोडर) और init (डिकोडर) जोड़ता हूं यह काम नहीं करता है।

+0

त्रुटि क्या है? –

+0

आपको आवश्यक init कोशिश करनी है। मैंने जवाब जोड़ा है @ankit –

+0

आप अपने 'init() 'में वास्तव में क्या जोड़ना चाहते हैं? यदि यह केवल टैप इशारा है, तो आप इसे 'viewDidLoad()' में भी कर सकते हैं, या यहां तक ​​कि इसे आलसी var बना सकते हैं। – Eendje

उत्तर

4

मुझे लगता है कि आप जोड़ना

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

या

convenience init() { 
    self.init() 
} 

आप init भी लिखने के लिए होता है। यह न निकालें

var tap: UITapGestureRecognizer? 

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { 
    super.init(nibName: nil, bundle: nil) 
} 

तुम बस के बजाय एक सुविधा प्रारंभकर्ता बना सकते हैं यह मदद करता है

+3

यह त्रुटि देता है "सुपरक्लास के नामित प्रारंभकर्ता को कॉल करना चाहिए" –

6

आशा है, सुविधा initializers init (ओवरराइड नहीं करते) के बजाय यह सिर्फ यह चीजों को आसान बनाने के लिए कहता है।

class ViewController: UIViewController { 
    var tap: UITapGestureRecognizer? 
    convenience init(){ 
     self.init() 
     tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:")) 
    } 
} 
+0

ऐप क्रैश हो जाता है क्योंकि टैप शून्य है, भले ही इसे init में मान दिया गया हो। –

+0

क्या आप किसी अन्य वर्ग से टैप का उपयोग करने का प्रयास कर रहे हैं? – Icaro

+0

उसी वर्ग में टैप घोषित किया गया है .. बस आपके कोड की तरह। –

37

मैं प्रयोग किया है:

convenience init() { 
    self.init(nibName:nil, bundle:nil) 
} 

कुछ लोगों का सुझाव दिया:

convenience init(){ 
    self.init() 
} 

लेकिन यह आप एक अनंत लूप देता है।

+1

यह सही जवाब होना चाहिए। –

+0

मुझे "self.init (nibName: nil, bundle: nil)" कथन पर "तर्क देने के लिए तर्क दिया गया है जो तर्क नहीं देता है" त्रुटि प्राप्त हो रही है। – RenniePet

+0

मेरे नियंत्रक द्वारा नहीं बुलाया जाता है। – Jonny

13

आप उन दोनों में init(nibName:bundle:) प्रारंभकर्ता, औरinit(coder:) आवश्यक प्रारंभकर्ता प्रदान ओवरराइड करने के लिए, और प्रारंभ tap की जरूरत: इसके अलावा

class ViewController: UIViewController { 

    var tap: UITapGestureRecognizer? 

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { 
     print("init nibName style") 
     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
     tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:")) 
    } 

    // note slightly new syntax for 2017 
    required init?(coder aDecoder: NSCoder) { 
     print("init coder style") 
     super.init(coder: aDecoder) 
     tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:")) 
    } 
... 
... 
} 

, सुनिश्चित करें कि जब सुपर क्लास प्रारंभकर्ता कि तुम नहीं बुला होना nibName और bundle के लिए बस nil पास करें। आपको जो कुछ भी पारित किया जाना चाहिए उसे पास करना चाहिए।

+2

'आवश्यक init (कोडर एडेकोडर: एनएससीओडर) 'के अंदर, आपके पास' super.init() 'है ... क्या यह' super.init (कोडर: एडेकोडर) नहीं होना चाहिए? –

+0

वास्तव में कोड उदाहरण में दो मामूली टाइपो थे। आप Xcode में स्वतः पूर्ण का उपयोग करके आसानी से टाइपो देख सकते हैं। रोमन, यदि आप इसे देखते हैं, तो मैंने टाइपो संपादित किया था। स्वाभाविक रूप से बदलने या खोलने के लिए स्वतंत्र महसूस करें। यह एकमात्र सही उत्तर है इसलिए मैंने टाइपो, चीयर्स पुरुषों को तय किया। – Fattie

12

ये सभी उत्तर अर्ध-उत्तर हैं। कुछ लोग संबंधित पोस्ट में अनंत लूप का अनुभव कर रहे हैं क्योंकि वे केवल convenience init() जोड़ रहे हैं (यदि आप इसे अलग करने के लिए एक अलग init() विधि प्रदान नहीं करते हैं, तो यह फिर से कॉल करता है), जबकि अन्य लोग सुपरक्लास का विस्तार करने की उपेक्षा कर रहे हैं। यह प्रारूप पूरी तरह से समस्या को पूरा करने के लिए सभी समाधानों को जोड़ता है।

// This allows you to initialise your custom UIViewController without a nib or bundle. 
convenience init() { 
    self.init(nibName:nil, bundle:nil) 
} 

// This extends the superclass. 
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { 
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
    tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:")) 
} 

// This is also necessary when extending the superclass. 
required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") // or see Roman Sausarnes's answer 
} 

संपादित करें: इसके अलावा, अगर आप सभी ओवरराइड init() तरीकों शिकायत के बिना अपने convenience init() विधि में पारित कर दिया पैरामीटर का उपयोग कर किसी भी वर्ग गुण आरंभ करना चाहते हैं, तो आप उन सभी गुण के रूप में परोक्ष unwrapped optionals निर्धारित कर सकते हैं, जो एक पैटर्न used by Apple themselves

0

मैं आपके इस प्रश्न में आया हूं कि आप लंबे समय से वापस पूछे। लेकिन किसी ने भी प्रश्न का मूल उत्तर प्रदान नहीं किया है। स्विफ्ट में यह मूलभूत है कि: - सुपर क्लास प्रारंभिक कक्षा पूर्ण होने से पहले इसके चर को प्रारंभ करना होगा।

रूप अंकित गोयल

इसलिए दुर्घटना का उल्लेख किया: - "सुपर क्लास के एक नामित प्रारंभकर्ता कॉल करना होगा"

इसलिए अद्यतन कोड होगी: -

class ViewController: UIViewController { 
var tap: UITapGestureRecognizer? 

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { 
print("init nibName style") 
self.tap = nil 
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
self.tap = UITapGestureRecognizer(target: self, action: Selector(("handleTap:"))) 
} 

required init?(coder aDecoder: NSCoder) { 
print("init coder style") 
self.tap = nil 
super.init(coder: aDecoder) 
tap = UITapGestureRecognizer(target: self, action: Selector(("handleTap:"))) 
}}