我试图从我编写的iOS 8框架中加载图像(在Swift中)。我正在使用Xcode 6 Beta 6
如果图片存储在我的框架Images.xcassets
中,则此代码无效(即加载图片):
let image = UIImage(named: "Background.png")
如果图像存储在主机应用程序的Images.xcassets
中(使用框架),则正确加载图像(从框架内的代码中)。
我可以看到框架Images.xcassets
包含在Copy Bundle Resources
阶段。
我还使用故事板文件作为框架中的资源;并正确加载。
我尝试重命名框架的Images.xcassets以避免与主机应用程序发生某种命名冲突,但这也不起作用。
答案 0 :(得分:61)
虽然@Renatus的答案是完全有效的并且解决了核心问题(需要指定框架的捆绑包),但我想发布我使用的解决方案,因为它稍微更直接:
Swift 3.0 / 4.0 / 5.0
let image = UIImage(named: "YourImage", in: Bundle(for: YOURFRAMEWORKCLASS.self), compatibleWith: nil)
或者,您可以将此模式用于非class
,即非“静态”函数:
let image = UIImage(named: "YourImage", in: Bundle(for: type(of: self)), compatibleWith: nil)
或class
函数的此模式:
let image = UIImage(named: "YourImage", in: Bundle(for: self), compatibleWith: nil)
这些替代方案更适合切割和粘贴。
答案 1 :(得分:12)
UIImage(名称:" Background.png")在内部调用NSBundle.mainBundle()。因此,您的代码正在尝试在主机应用程序的包中查找资源,而不是在框架包中。要从您的框架包中加载UIImage,请使用以下代码段:
let frameworkBundle = NSBundle(forClass: YOURFRAMEWORKCLASS.self)
let imagePath = frameworkBundle.pathForResource("yourImage.png", ofType: "")
if imagePath != nil {
result = UIImage(contentsOfFile: imagePath!)
}
编辑:补充说明(thx to milz)
答案 2 :(得分:2)
在Swift 3.0中:
let currentBundle = Bundle(for: YOURCLASS.self)
guard let path = currentBundle.path(forResource: imageName, ofType: "jpg") else { return defaultImage }
return UIImage(contentsOfFile: path) ?? defaultImage
答案 3 :(得分:2)
另一个选择是分配包标识符,这比在可读性方面分配类更有意义。
在 Swift 3 :
cell.btnRequest.tag = indexPath.row
cell.btnRequest.addTarget(self,action:#selector(buttonClicked(sender:)), for: .touchUpInside)
func buttonClicked(sender:UIButton) {
let buttonRow = sender.tag
}
答案 4 :(得分:0)
接受的答案对我不起作用。这是一种用于加载嵌入在动态框架中的图像的简单方法:
var bundle = NSBundle(forClass: self.classForCoder)
if let bundlePath = NSBundle(forClass: self.classForCoder).resourcePath?.stringByAppendingString("/MYLIB.bundle"), resourceBundle = NSBundle(path: bundlePath) {
bundle = resourceBundle
}
let image = UIImage(named: "my-embedded-image", inBundle: bundle, compatibleWithTraitCollection: nil)