मेरी परियोजना में मैं एक XIB फ़ाइल से एक कस्टम UIView बनाने की कोशिश कर रहा हूँ। मैंने कुछ ट्यूटोरियल का अनुसरण किया और लोड करने के लिए नीचे दिए गए कोड पर पहुंचा

import UIKit

class StorePricing: UIView {

    override init(frame: CGRect) {

        super.init(frame: frame)
        self.setupView()
    }

    required init?(coder aDecoder: NSCoder) {

        super.init(coder: aDecoder)
        self.setupView()
    }

    private func setupView() {

        let view = self.loadViewFromXib()

        view.frame = self.bounds
        view.autoresizingMask = [.flexibleHeight, .flexibleWidth]

        self.addSubview(view)
    }

    private func loadViewFromXib() -> UIView {

        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: String(describing: type(of: self)), bundle: bundle)
        let view = nib.instantiate(withOwner: self, options: nil).first as! UIView

        return view

    }

}

जब मैं इस कस्टम व्यू को किसी अन्य दृश्य में जोड़ता हूं तो मेरा ऐप क्रैश हो जाता है और मैंने देखा कि init कॉल अनिश्चितकालीन लूप में कहा जाता है। मेरे कस्टम दृश्य में कॉल पदानुक्रम इस प्रकार है

  1. इनिट कोडर को कॉल करें
  2. सेटअप व्यू पर कॉल करें ()
  3. लोड करने के लिए कॉल करेंViewFromXib ()

Nib.instantiate कॉल init कोडर और लूप अनिश्चित हो जाता है

इस मुद्दे को कैसे हल करें इस पर कोई सुझाव?

4
slysid 18 जुलाई 2017, 15:33

5 जवाब

सबसे बढ़िया उत्तर

यदि आपकी xib फ़ाइल में आपके दृश्य का एक उदाहरण है, तो यह लोड हो गया है, यह init (कोडर :) को कॉल करेगा, जो फिर xib फ़ाइल को फिर से लोड करेगा, और चक्र पुनरारंभ होगा। मैं या तो xib फ़ाइल से आपके दृश्य के उदाहरण हटा दूंगा, या init (कोडर :) के भीतर से setupView() को कॉल नहीं करूंगा।

3
Ben Gottlieb 18 जुलाई 2017, 15:41

आपका setupView() (init(coder:) में निष्पादित) निब को फिर से लोड करता है जो init with coder को फिर से सक्रिय करता है, जिससे अनंत पुनरावृत्ति होती है।

निब को init(coder:) के अंदर इंस्टेंट न करें। यदि आप इसे लोड करने के बाद दृश्य को कॉन्फ़िगर करना चाहते हैं तो इसे उदाहरण के लिए awakeFromNib विधि में करें।

3
RaffAl 18 जुलाई 2017, 15:39

आप शायद अनंत रिकर्सन प्राप्त कर रहे हैं, यदि आपकी .xib फ़ाइल में, आपके नए दृश्य (स्टोर प्राइसिंग) के लिए आपका कस्टम क्लास क्लास प्रकार आपके नए कस्टम क्लास नाम (स्टोर प्राइसिंग) पर सेट है। इसे UIView पर सेट किया जाना चाहिए। यह समझने के लिए कि क्या हो रहा है, जब nib.instantiate(...) .xib पढ़ रहा होता है और आपके विचार के लिए कस्टम क्लास का नाम आता है, तो वह इसे बनाने के लिए required init?(coder aDecoder: NSCoder) को कॉल करता है, और फिर, इसके चारों ओर जाता है। फ़ाइल के स्वामी कस्टम वर्ग को अपने कस्टम वर्ग पर सेट करें। यह आपको .xib फ़ाइल से अपनी कोड फ़ाइल में संदर्भ आउटलेट स्थापित करने की अनुमति देगा।

2
Heliotropix 30 सितंबर 2017, 01:34

फ़ाइल के स्वामी वर्ग को अपने कस्टम वर्ग पर सेट करें।

enter image description here

1
Trupti 22 अगस्त 2019, 21:27

ऐसा इसलिए है क्योंकि हर बार जब आप setupView() को कॉल करते हैं तो आप सब व्यू जोड़ते हैं। तो यह हर बार फिर से होता है। उसके लिए मैंने जो किया था आप नीचे देख सकते हैं। आशा आपकी मदद करेगी।

class TableBackGroundView: UIView {

  // Here is my common view handled
  var view: UIView!

    override init(frame: CGRect) {
        super.init(frame: frame)

        xibSetup()
    }

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

        xibSetup()
    }

    func xibSetup() {

        let nib = UINib(nibName: "TableBackGroundView", bundle: nil)
        view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView

        // use bounds not frame or it'll be offset
        view.frame = bounds

        // Make the view stretch with containing view
        view.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]
        addSubview(view)
    }
}
0
Jaydeep Vora 18 जुलाई 2017, 15:50