为啥我无法加载位于资产目录中的图像?
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】:
您可以按名称访问资产目录中的图像,但不能使用 NSImage
的 imageNamed:
方法 -
相反,您可以查询特定名称的图像资源包,例如要在请求图像的类的捆绑包中找到图像,您会:
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 运行时,项目无法加载图像资产
无法从嵌套组件中的资产文件夹加载图像(Vue.js 2.0 / Webpack)