为啥我无法加载位于资产目录中的图像?

Posted

技术标签:

【中文标题】为啥我无法加载位于资产目录中的图像?【英文标题】:Why can't I load an image which is located in the assets catalog?为什么我无法加载位于资产目录中的图像? 【发布时间】:2016-07-30 15:29:47 【问题描述】:

我正在尝试构建一个简单的屏幕保护程序。我要做的第一件事是使用方法[NSImage imagedNamed:] 从资产目录加载图像,该方法返回一个零值,这意味着它找不到图像。当我尝试使用该方法直接从包中加载图像时

[[NSBundle mainBundle] URLForImageResource:]

我也得到一个 nil 值。我不明白为什么会这样。该图像位于资产目录中,在项目设置中我已将其设置为捆绑资源。

【问题讨论】:

[NSImage imageNamed:] 用于访问应用程序包中的图像,而不是资产目录。为什么不能将图片放入 app bundle 中? 我已经针对视网膜和非视网膜 mac 优化了我的图像版本,所以我认为最好的方法是资产目录。当然,我可以将图像直接放在应用程序包中,但这也不起作用。 【参考方案1】:

可以按名称访问资产目录中的图像,但不能使用 NSImageimageNamed: 方法 -

相反,您可以查询特定名称的图像资源包,例如要在请求图像的类的捆绑包中找到图像,您会:

NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSImage *myImage = [bundle imageForResource:@"MyImageName"];  

其中 MyImageName 是指您在资产目录中为图像指定的名称。

【讨论】:

【参考方案2】:

在我继续在互联网上搜索后,我发现屏幕保护程序是作为某种插件执行的,通过加载主包我加载了系统偏好包,这意味着我无法通过加载主包来获取我的资源捆绑包,相反,我必须使用 bundleIdentifier 或保存捆绑包的路径加载捆绑包。 所以我的代码现在看起来像这样:

NSBundle*bundle=[NSBundle bundleWithIdentifier:@"com.myname.APOD"];
NSImage*image=[[NSImage alloc] initWithContentsOfFile:[bundle pathForResource:@"appimage" ofType:@"png"]];

【讨论】:

以上是关于为啥我无法加载位于资产目录中的图像?的主要内容,如果未能解决你的问题,请参考以下文章

从 Visual Studio IDE 运行时,项目无法加载图像资产

Flutter:无法加载资产文件“car.png”

无法从嵌套组件中的资产文件夹加载图像(Vue.js 2.0 / Webpack)

Flutter 无法在物理设备上加载图像资产(但在模拟器上加载它就好了)

Rails 4:资产未在生产中加载

资产目录,图像未在设备上加载,但在模拟器中很好