从另一个包加载资源

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

【讨论】:

以上是关于从另一个包加载资源的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个包中只导入一个函数,而不加载整个命名空间

使用 NSBundle 加载我的资源

AssetBundle-----资源包划分

如何从另一个 UIViewController 重新加载 UITableViewController

从另一个视图重新加载表视图

从另一个类重新加载 UITableView?