2014-07-10 8 views
18

के साथ तैयार करने में एक छवि को लोड करने के लिए कैसे करें I इंटरफ़ेस को संपादित करते समय इंटरफ़ेस बिल्डर में दिखाए जाने के लिए आईबी डिज़ाइन करने योग्य UIImageView में नमूना छवि लोड करना चाहूंगा। निम्नलिखित कोड काम नहीं करता है, आईबी में दृश्य प्लेसहोल्डर के रूप में खाली रहता है (दृश्य क्षेत्र केवल UIImageView पाठ होता है):एक आईडी डिज़ाइन करने योग्य UIImageView

@IBDesignable 
class TestImageView : UIImageView 
{ 
    override func prepareForInterfaceBuilder() { 
     //let bundle = NSBundle.mainBundle() 
     let bundle = NSBundle(forClass: nil) 
     let imagePath = bundle.pathForResource("Test", ofType: "jpg") 
     self.image = UIImage(contentsOfFile: imagePath) 
    } 
} 

ध्यान दें कि:

    आईबी में
  • के लिए कस्टम वर्ग वर्ग देखें सही है (TestImageView)
  • प्रोजेक्ट में test.jpg मौजूद है (यदि मैं आईबी में UIImageView की छवि प्रॉपर्टी मैन्युअल रूप से सेट करता हूं)।
  • मैं यह Xcode 6 बीटा के साथ 3.

    अद्यतन परीक्षण किया गया था कोड

में बंडल वर्तमान होने का दो अलग अलग तरीकों की कोशिश की: दोनों ही मामलों में बंडल पथ मैं "/Applications/Temporary/Xcode6-Beta3.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Overlays" है । उस रास्ते में छवि स्पष्ट रूप से मौजूद नहीं है।

+0

सेब रडार पर एक रडार पोस्ट किया गया है: // 17762946 – mxb

+1

कहता है, क्या आप तैयार करने के लिए सुपर को कॉल नहीं करना चाहिएForInterfacebuilder? उत्तर देने के लिए – Fattie

उत्तर

3

स्विफ्ट 3.0 में @kasplat के कोड में बदल गया है:

// DYNAMIC BUNDLE DEFINITION FOR DESIGNABLE CLASS 
let theBundle = Bundle(for: type(of: self)) 

// OR ALTERNATIVELY BY PROVDING THE CONCRETE NAME OF DESIGNABLE CLASS 
let theBundle = Bundle(for: RH_DesignableView.self) 

// AND THEN SUCCESSFULLY YOU CAN LOAD THE RESSOURCE 
let theImage = UIImage(named: "Logo", in: theBundle, compatibleWith: nil) 
49

इस तरह वर्ग के बंडल हो रही का प्रयास करें:

let bundle = NSBundle(forClass: self.dynamicType) 

या इस

let bundle = NSBundle(forClass: TestImageView.self) 

तरह वर्ग नाम निर्दिष्ट मान लिया जाये कि आपकी छवि बंडल में है, उदाहरण के Images.xcassets के लिए, इसके बाद आप इसका उपयोग कर लोड कर सकते हैं:

self.image = UIImage("Test", inBundle: bundle, compatibleWithTraitCollection: self.traitCollection) 

यह जांचना याद रखें कि आपकी छवि शून्य बीएफ है या नहीं अयस्क इसका उपयोग करने की कोशिश कर रहा है। मैं सामान्य छवि संपत्तियों के साथ सही ढंग से काम करने के लिए bundle.pathForResource का उपयोग कर छवि पथ प्राप्त करने में सक्षम नहीं हूं। वहां एक यूआईएममेज कॉल भी नहीं दिखता है जहां आप केवल नाम और बंडल निर्दिष्ट करते हैं, इसलिए आपको विशेषता संग्रह का उपयोग करना होगा।

इस सवाल से संबंधित है: एप्पल से

xcode 6 IB_DESIGNABLE- not loading resources from bundle in Interface builder

रिस्पांस ...

इंजीनियरिंग निर्धारित किया है कि इस मुद्दे के रूप में इरादा आधारित बर्ताव करता है निम्नलिखित पर:

हम वास्तव में बंडल निर्दिष्ट करने से इसे आसान नहीं बना सकते हैं। आप कह सकते हैं, "ओह, चलो स्विजल करें - [एनएसबंडल मेनबंडल]", लेकिन बहुत सारे बंडल का संदर्भ देने वाली कॉल साइटें वहां नहीं जाती हैं (या सीएफ एपीआई के माध्यम से)। कोई तब कह सकता है "ठीक है, ठीक है तो हम कैसे कम से कम swizzle - [UIImage imageNamed:]" के बारे में। यहां समस्या यह है कि मुख्य बंडल के लिए कोई भी प्रतिस्थापन नहीं है। आपके पास एकाधिक लाइव व्यू बंडल (या तो ढांचे या ऐप्स) एक साथ लोड हो सकते हैं, इसलिए हम केवल मुख्य बंडल होने के लिए नहीं चुन सकते हैं।

डेवलपर्स को बंडलों से अवगत होना चाहिए और बंडल से छवियां कैसे प्राप्त करें।डेवलपर्स को सभी छवि लुकअप के लिए UIImage (नाम: इनबंडल: संगत WithTraitCollection :) का उपयोग करना चाहिए।

+0

thx, लेकिन ऐसा करने का सही तरीका मेरे अपने उत्तर में वर्णित होना चाहिए। – mxb

+3

मैंने बंडल उदाहरण प्रदान किया क्योंकि मैंने लाइव व्यू में संसाधन ढूंढने में असमर्थ होने के बारे में ऐप्पल को एक बग रिपोर्ट (17656550) पोस्ट की थी। मैंने ऐप्पल से जवाब को मेरे जवाब में जोड़ा। – kasplat

+0

महान जांच, जाहिर है आपको "स्कोप" के बारे में बहुत जागरूक होना चाहिए जिसमें लाइव व्यू के रूप में प्रस्तुत किए जाने पर विचार रहते हैं। –

5

मैं वर्तमान NSProcessInfo ऑब्जेक्ट से इंटरफेस बिल्डर परियोजना पथ प्राप्त करने में समस्या को ठीक करने में सक्षम था। फिर आप IB_PROJECT_SOURCE_DIRECTORIES कुंजी से सही पथ एकत्र कर सकते हैं।

override func prepareForInterfaceBuilder() { 
    let processInfo = NSProcessInfo.processInfo() 
    let environment = processInfo.environment 
    let projectSourceDirectories : AnyObject = environment["IB_PROJECT_SOURCE_DIRECTORIES"]! 
    let directories = projectSourceDirectories.componentsSeparatedByString(":") 

    if directories.count != 0 { 
     let firstPath = directories[0] as String 
     let imagePath = firstPath.stringByAppendingPathComponent("PrepareForIBTest/Test.jpg") 

     let image = UIImage(contentsOfFile: imagePath) 
     self.image = image 
    } 
} 

इस तकनीक WWDC 2014 411 सत्र "इंटरफ़ेस बिल्डर में नया क्या है" के रूप में इस Apple Developer Forums post में bjhomer ने सुझाव दिया में वर्णित है।

इसके अलावा, मैं कहना है कि यह एक UIView उपवर्ग करने के लिए स्विच करने के लिए आवश्यक था, क्योंकि ऐसा लगता है कि UIImageView की appereance लाइव विचारों में परिवर्तन नहीं करता है की जरूरत है।

+1

मुझे लगता है कि सही प्रतिक्रिया या तो इस पोस्ट में # कैस्प्लट है या उस पर @rickster है: http://stackoverflow.com/questions/24603232/xcode-6-ib-designable-not-loading-resources-from- बंडल-इन-इंटरफेस-बिल्डर – SwiftArchitect

+0

मैं इस उत्तर को स्वीकार कर रहा था क्योंकि यह डब्ल्यूडब्ल्यूडीसी सत्र पर आधारित है, इसलिए यह ऐप्पल से आधिकारिक जानकारी की तरह मुझे दिखाई दिया। तुम क्या सोचते हो? – mxb

+0

ऐसा लगता है कि ऐप्पल अब एक आसान दृष्टिकोण प्रदान करता है: 'readyForInterfacebuilder' केवल आपको अभी तक ले जा सकता है, और बहुत विशिष्ट कार्रवाई की आवश्यकता है।'एनएसबंडल: फोर्क्लास' दूसरी तरफ नुकीला और अच्छी तरह से encapsulated है। शायद ऐप्पल अब बग (17656550) के जवाब में एक बेहतर, अधिक हल्का समाधान प्रदान कर रहा है? – SwiftArchitect

0

स्विफ्ट 2 और एक्सकोड 7 के लिए, इंटरफ़ेस बदल दिया गया है।

let bundle = NSBundle(forClass: self.dynamicType) 
let image = UIImage(named: "imageName", inBundle: bundle, compatibleWithTraitCollection: self.traitCollection) 
let imageView = UIImageView(image: image) 

का उपयोग करना चाहिए मैं my project में इसका इस्तेमाल करते हैं, तो यह दोनों आईबी और डिवाइस के लिए ठीक काम करता है।

+0

धन्यवाद बदल दूंगा। हालांकि मुझे यह नहीं पता कि यह @ kasplat उत्तर से अलग कैसे है। – mxb

+0

UIImage का init अलग है। –

0

यह आपके आईबी डिज़ाइन करने योग्य, या यदि आपके पास कोई नहीं है - डिफ़ॉल्ट छवि।

- (void)prepareForInterfaceBuilder 
{ 
    NSBundle *bundle = [NSBundle bundleForClass:[self class]]; 
    imagePic = imagePic ? [imagePic imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] : [UIImage imageNamed:@"goodIcon" inBundle:bundle compatibleWithTraitCollection:self.traitCollection]; 

} 
7

तेज 3 जवाब में पॉप की सुविधा देता है

let bundle = Bundle(for: self.classForCoder) 
... UIImage(named: "AnImageInYourAssetsFolderPerhaps", in: bundle, compatibleWith: self.traitCollection)! 
2

स्विफ्ट 4 के लिए (और 3) इस का उपयोग :

let image = UIImage(named: "foo", in: Bundle(for: type(of: self)), compatibleWith: traitCollection) 

इस दृष्टिकोण को बंडल सार्वभौमिक रूप से

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