2017-01-24 10 views
6

मैं वर्तमान में गैर-वैकल्पिक छवियों के लाभों का आनंद लेने के लिए image literals का उपयोग करने के लिए एक प्रोजेक्ट अपडेट कर रहा हूं। परियोजना विभिन्न ढांचे का आयात कर रही है, और ढांचे में छवियां हैं।एक्सकोड 8: फ्रेमवर्क में छवि अक्षर का उपयोग

ढांचे में, हमें प्रारंभिक ओवरराइड को ओवरराइड करने के लिए UIImage पर एक एक्सटेंशन घोषित करना पड़ा, क्योंकि यह गलत बंडल में छवि की तलाश में था। हम जैसे कुछ किया:

extension UIImage { 
    convenience init?(framework_named imageName: String) { 
     let bundle = Bundle(for: ClassNameInFramework.self) 
     self.init(named: imageName, in: bundle, compatibleWith: nil) 
    } 
} 

मैं ढांचे में भी छवि शाब्दिक का उपयोग करना चाहते रहा हूँ, लेकिन पहले की तरह, शाब्दिक छवि के लिए गलत बंडल के लिए देख रहे हैं और आवेदन दुर्घटनाओं।

क्या किसी को पता है कि छवि को देखने के लिए बंडल किस छवि को शाब्दिक रूप से निर्दिष्ट करना है?

+1

दुर्भाग्य से निर्दिष्ट नहीं कर सकता। छवि अक्षर 'इनिट (नाम:)' प्रारंभकर्ता कहते हैं जो मुख्य बंडल में दिखता है। – dan

+1

@dan क्या आप मुझे कुछ दस्तावेज पर इंगित कर सकते हैं? – dirtydanee

उत्तर

3

मैंने एक बहुत ही सरल कामकाज की खोज की और अन्य पदों पर कहीं भी इसे खोजने के लिए आश्चर्यचकित नहीं था। मेरी इच्छा है कि यह अधिक सुरुचिपूर्ण हो सकता है, लेकिन यह मेरी राय में बदसूरत टाइप किए गए प्रारंभकर्ता के बदसूरत UIImage(named:in:compatibleWith:) का उपयोग करने से बेहतर है।

struct WrappedBundleImage: _ExpressibleByImageLiteral { 
    let image: UIImage 

    init(imageLiteralResourceName name: String) { 
     let bundle = Bundle(for: ClassInFramework.self) 
     image = UIImage(named: name, in: bundle, compatibleWith: nil)! 
    } 
} 

नोट है कि मैं एक आवरण के बजाय का उपयोग एक UIImage की:

हम मूल रूप से _ExpressibleByImageLiteral प्रोटोकॉल है, जो क्या Xcode निर्धारित करने के लिए एक प्रकार, शाब्दिक तो जैसे एक छवि से व्यक्त है का उपयोग करता है का लाभ लेने सबक्लास, जो एक बेहतर विकल्प की तरह प्रतीत होता है। अफसोस की बात है, UIImage जैसी कक्षाओं को उप-वर्गीकृत करने का इरादा नहीं है और यदि आप ऐसा करते हैं तो आपको खुद को बहुत सी सिरदर्द मिल जाएगी।

और अब इसके उपयोग हो जाता है:

let image = (as WrappedBundleImage).image 

एक सामान्य छवि के रूप में के रूप में संक्षिप्त नहीं शाब्दिक, लेकिन अभी भी, संकलन समय जाँच :)। हमें बस as कास्टिंग करना याद रखना है, अन्यथा हमारे कस्टम प्रारंभकर्ता को कॉल नहीं किया जाएगा।

तुम भी कुछ इस तरह कर सकते हैं:

extension UIImage { 
    static func fromWrappedBundleImage(_ wrappedImage: WrappedBundleImage) -> UIImage { 
     return wrappedImage.image 
    } 
} 

और अब हम इस तरह इसका इस्तेमाल कर सकते हैं:

UIImage.fromWrappedBundleImage() 

आशा इस मदद करता है!

+0

यह बहुत अच्छा है, आदमी। –

+0

धन्यवाद @ पल्ज़ोलटन, मुझे भी ऐसा लगता है। मुझे नहीं लगता कि लोग जवाब क्यों दे रहे हैं। हां, यह शायद सामान्य रूप से एक छवि का उपयोग करने के रूप में सुंदर नहीं है, लेकिन यह संकलित समय की जांच की गई है, इसलिए UIImage को कॉल करने से बहुत सुरक्षित (नाम: में: संगत With:) ... मेरी राय में, यह उपयोग करने से अधिक मूल्यवान है "नामित: इन: संगत विथ" प्रारंभकर्ता सिर्फ _ExpressibleByImageLiteral प्रोटोकॉल का उपयोग नहीं करना चाहते हैं, जो बहुत रहस्यमय नहीं है (बिल्कुल अन्य ExpressibleBy प्रोटोकॉल की तरह व्यवहार करता है)। आप हमेशा रनटाइम मुद्दों को रोकना चाहते हैं, विशेष रूप से ढांचे में ... – diegomontoyas

संबंधित मुद्दे