在OS X Yosemite(10.10)中从框架加载图像的最佳方法是什么?

rob*_*cer 7 cocoa nsimage nsbundle osx-yosemite

我正在开发一个包含Notification Center小部件(或Today扩展)的Yosemite应用程序.我有一个框架,我将存储我的所有共享代码和资源,其中包括一些图像.无论我是使用PNG还是资产目录,如果我只使用标准NSImage方法,它们都不会加载imageNamed:.看一下文档,这显然是预期的 - 它只在主要包中查找.

在iOS上,UIImage有一个新的方法,imageNamed:inBundle:compatibleWithTraitCollection:这是完全适合这个问题.我没有看到类似的东西NSImage.

看起来最好的选择是做这样的事情:

[[NSBundle bundleForClass:[self class]] imageForResource:@"name"];
Run Code Online (Sandbox Code Playgroud)

这个问题的主要问题是它不使用缓存.为了做到这一点,我在一个类别中添加了我自己的方法:

+ (NSImage *)imageNamed:(NSString *)name inBundle:(NSBundle *)bundle {
    NSImage *image = [NSImage imageNamed:name];
    if (image == nil) {
        image = [bundle imageForResource:name];
        [image setName:name];
    }
    return image;
}
Run Code Online (Sandbox Code Playgroud)

这似乎没问题,但有更好的解决方案吗?

Qui*_*lor 4

目前还没有 API 可以在一个方法调用中执行此操作,但我刚刚提交了radar://25632204 来请求+[NSImage imageNamed:inBundle:]添加它以与 UIKit 保持一致。