从iOS 8框架加载图像

Dan*_*iel 30 swift ios8

我正在尝试从我正在编写的iOS 8框架中加载图像(在Swift中).我正在使用Xcode 6 Beta 6

如果图像存储在我的框架中,则此代码不起作用(即加载图像)Images.xcassets:

let image = UIImage(named: "Background.png")
Run Code Online (Sandbox Code Playgroud)

如果图像存储在Images.xcassets主机应用程序(使用框架)中,则正确加载图像(从框架内的代码).

我可以看到框架Images.xcassets包含在Copy Bundle Resources阶段中.

我也使用故事板文件作为框架中的资源; 这适当加载.

我已经尝试重命名框架的Images.xcassets以避免与主机应用程序发生某种命名冲突,但这也不起作用.

Dan*_*iel 62

虽然@Renatus的答案是完全有效的并且解决了核心问题(需要指定框架的捆绑包),但我想发布我使用的解决方案,因为它稍微更直接:

Swift 3.0/4.0

let image = UIImage(named: "YourImage", in: Bundle(for: YOURFRAMEWORKCLASS.self), compatibleWith: nil)
Run Code Online (Sandbox Code Playgroud)

或者,您可以将此模式用于class非"非静态"函数:

let image = UIImage(named: "YourImage", in: Bundle(for: type(of: self)), compatibleWith: nil)
Run Code Online (Sandbox Code Playgroud)

或这种class功能模式:

let image = UIImage(named: "YourImage", in: Bundle(for: self), compatibleWith: nil)
Run Code Online (Sandbox Code Playgroud)

这些替代品更适合切割和粘贴.

  • 为我工作,但很好地详细说明你的框架类的含义.我最初尝试过伞头,但是没有用,所以我用主入口点类替换它到框架......这很有效. (3认同)

Ren*_*tus 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!)
}
Run Code Online (Sandbox Code Playgroud)

编辑:补充说明(thx to milz)

  • 补充说明 (3认同)
  • 虽然您的答案可以解决问题,但如果您能够提供问题的描述以及您的答案如何解决问题,则总是更好.这是进一步改善这一和未来答案的建议. (2认同)