【问题标题】:Loading resources from another bundle从另一个包加载资源
【发布时间】:2011-06-25 02:06:49
【问题描述】:

如果我有一个包含一个类和该类使用的一些资源的包。如果我从包中加载类,我应该如何在该类中加载资源(在我从中加载类的包中)?

假设我想在我的对象中加载一个图像,该图像是从包中加载的类实例化的。 如果我这样做了

NSImage *image = [NSImage imageNamed:@"myImage"];

它会从我加载类的位置加载包内的图像吗?还是会在加载了类和资源包的应用程序包中查找?

【问题讨论】:

    标签: cocoa macos bundle nsbundle


    【解决方案1】:

    在 OS X 10.7+ 上这样做:

    NSBundle *otherBundle = [NSBundle bundleWithIdentifier: @"com.company.otherapp"];
    NSImage *imageFromOtherBundle = [otherBundle imageForResource: @"imageName"];
    

    【讨论】:

      【解决方案2】:

      此方法搜索命名图像 在几个地方,返回第一个 它找到与给定匹配的图像 姓名。搜索顺序如下 如下:

      1. 搜索名称为 使用 setName 显式设置: 方法,目前驻留在 图片缓存。
      2. 搜索应用程序的 文件名的主包 匹配指定的字符串。 (为了 有关捆绑包的信息 搜索,请参阅““访问捆绑包的 Bundle Programming 中的“目录” 指导。)
      3. 搜索应用套件 与共享图像的框架 指定的名称。查找文件时 在应用程序包中,它是 更好(但不是必需)包括 名称中的文件扩展名 范围。 (Link)

      【讨论】:

      • 那么在这种情况下你将如何加载它? 1)不适用,因为图像之前没有加载(它不在缓存中)2)不适用,因为它在一个单独的包中而不是主包中 3)它不是一个 appkit 框架。
      • 创建一个NSBundle 实例。获取文件路径。加载图像。
      • 但是我有一个对象,它是从从该包加载的类中实例化的。我是否创建类所在的同一个包的 NSBundle 实例并从该包加载图像?如果该类在包中,我如何加载包含该类中定义的方法中的类的包?
      • @thealch3m1st:如果您有来自捆绑包的类的实例,则捆绑包已经存在并已加载。尝试再次实例化捆绑包将为您提供现有实例,并且尝试再次加载它将无济于事。 @Alexsander 的评论是正确的解决方案,真的应该是/另一个答案。有关更多详细信息,请查看 Foundation 和 AppKit 中的 NSBundle 文档(AppKit 添加了在包中查找图像或声音的方法)。
      【解决方案3】:

      您可以使用NSBundle+bundleForClass: 类方法来获取对特定类的捆绑包的引用。

      然后您可以使用NSBundle‑pathForImageResource: 方法获取图像的路径并使用该路径创建NSImage

      【讨论】:

        猜你喜欢
        • 2014-12-13
        • 2013-03-29
        • 2012-07-04
        • 2015-02-19
        • 1970-01-01
        • 1970-01-01
        • 2011-05-06
        • 1970-01-01
        • 2012-07-25
        相关资源
        最近更新 更多