मेरी परियोजना में मैं एक 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 कॉल अनिश्चितकालीन लूप में कहा जाता है। मेरे कस्टम दृश्य में कॉल पदानुक्रम इस प्रकार है
- इनिट कोडर को कॉल करें
- सेटअप व्यू पर कॉल करें ()
- लोड करने के लिए कॉल करेंViewFromXib ()
Nib.instantiate कॉल init कोडर और लूप अनिश्चित हो जाता है
इस मुद्दे को कैसे हल करें इस पर कोई सुझाव?
5 जवाब
यदि आपकी xib फ़ाइल में आपके दृश्य का एक उदाहरण है, तो यह लोड हो गया है, यह init (कोडर :) को कॉल करेगा, जो फिर xib फ़ाइल को फिर से लोड करेगा, और चक्र पुनरारंभ होगा। मैं या तो xib फ़ाइल से आपके दृश्य के उदाहरण हटा दूंगा, या init (कोडर :) के भीतर से setupView() को कॉल नहीं करूंगा।
आपका setupView()
(init(coder:)
में निष्पादित) निब को फिर से लोड करता है जो init with coder
को फिर से सक्रिय करता है, जिससे अनंत पुनरावृत्ति होती है।
निब को init(coder:)
के अंदर इंस्टेंट न करें। यदि आप इसे लोड करने के बाद दृश्य को कॉन्फ़िगर करना चाहते हैं तो इसे उदाहरण के लिए awakeFromNib
विधि में करें।
आप शायद अनंत रिकर्सन प्राप्त कर रहे हैं, यदि आपकी .xib फ़ाइल में, आपके नए दृश्य (स्टोर प्राइसिंग) के लिए आपका कस्टम क्लास क्लास प्रकार आपके नए कस्टम क्लास नाम (स्टोर प्राइसिंग) पर सेट है। इसे UIView पर सेट किया जाना चाहिए। यह समझने के लिए कि क्या हो रहा है, जब nib.instantiate(...) .xib पढ़ रहा होता है और आपके विचार के लिए कस्टम क्लास का नाम आता है, तो वह इसे बनाने के लिए required init?(coder aDecoder: NSCoder)
को कॉल करता है, और फिर, इसके चारों ओर जाता है। फ़ाइल के स्वामी कस्टम वर्ग को अपने कस्टम वर्ग पर सेट करें। यह आपको .xib फ़ाइल से अपनी कोड फ़ाइल में संदर्भ आउटलेट स्थापित करने की अनुमति देगा।
फ़ाइल के स्वामी वर्ग को अपने कस्टम वर्ग पर सेट करें।
ऐसा इसलिए है क्योंकि हर बार जब आप 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)
}
}
संबंधित सवाल
नए सवाल
ios
iOS, Apple iPhone, iPod टच और iPad पर चलने वाला मोबाइल ऑपरेटिंग सिस्टम है। IOS प्लेटफॉर्म पर प्रोग्रामिंग से संबंधित प्रश्नों के लिए इस टैग [ios] का उपयोग करें। उन प्रोग्रामिंग भाषाओं के लिए विशिष्ट मुद्दों के लिए संबंधित टैग [उद्देश्य-सी] और [स्विफ्ट] का उपयोग करें।