从另一个包加载资源
Posted
技术标签:
【中文标题】从另一个包加载资源【英文标题】:Loading resources from another bundle 【发布时间】:2011-06-25 02:06:49 【问题描述】:如果我有一个包含一个类和该类使用的一些资源的包。如果我从包中加载类,我应该如何在该类中加载资源(在我从中加载类的包中)?
假设我想在我的对象中加载一个图像,该图像是从包中加载的类实例化的。 如果我这样做了
NSImage *image = [NSImage imageNamed:@"myImage"];
它会从我加载类的位置加载包内的图像吗?还是会在加载了类和资源包的应用程序包中查找?
【问题讨论】:
【参考方案1】:在 OS X 10.7+ 上这样做:
NSBundle *otherBundle = [NSBundle bundleWithIdentifier: @"com.company.otherapp"];
NSImage *imageFromOtherBundle = [otherBundle imageForResource: @"imageName"];
【讨论】:
【参考方案2】:此方法搜索命名图像 在几个地方,返回第一个 它找到与给定匹配的图像 姓名。搜索顺序如下 如下:
搜索名称为 使用 setName 显式设置: 方法,目前驻留在 图片缓存。 搜索应用程序的 文件名的主包 匹配指定的字符串。 (为了 有关捆绑包的信息 搜索,请参阅““访问捆绑包的 Bundle Programming 中的“目录” 指导。) 搜索应用套件 与共享图像的框架 指定的名称。查找文件时 在应用程序包中,它是 更好(但不是必需)包括 名称中的文件扩展名 范围。 (Link)
【讨论】:
那么在这种情况下你将如何加载它? 1)不适用,因为图像之前没有加载(它不在缓存中)2)不适用,因为它在一个单独的包中而不是主包中 3)它不是一个 appkit 框架。 创建一个NSBundle
实例。获取文件路径。加载图像。
但是我有一个对象,它是从从该包加载的类中实例化的。我是否创建类所在的同一个包的 NSBundle 实例并从该包加载图像?如果该类在包中,我如何加载包含该类中定义的方法中的类的包?
@thealch3m1st:如果您有来自捆绑包的类的实例,则捆绑包已经存在并已加载。尝试再次实例化捆绑包将为您提供现有实例,并且尝试再次加载它将无济于事。 @Alexsander 的评论是正确的解决方案,真的应该是/另一个答案。有关更多详细信息,请查看 Foundation 和 AppKit 中的 NSBundle 文档(AppKit 添加了在包中查找图像或声音的方法)。【参考方案3】:
您可以使用NSBundle
的+bundleForClass:
类方法来获取对特定类的捆绑包的引用。
然后您可以使用NSBundle
的‑pathForImageResource:
方法获取图像的路径并使用该路径创建NSImage
。
【讨论】:
以上是关于从另一个包加载资源的主要内容,如果未能解决你的问题,请参考以下文章