NSbundle pathforresource找不到文件

时间:2015-04-15 13:38:08

标签: ios objective-c

我有images.xcassets列出了更复杂的捆绑资源,我尝试在文件名中单独说明:MSB_big_icon,然后尝试在images.xcassets中添加路径。

有谁能告诉我我做错了什么?

NSString *path = [[NSBundle mainBundle]pathForResource:@"/Raymio_android_images/MSB_big_icon.imageset/MSB_big_icon" ofType:@"png"];
NSLog(@"path: %@", path);
MSBIcon *tilecon = [MSBIcon iconWithUIImage:[UIImage imageWithContentsOfFile:path] error:&error];

3 个答案:

答案 0 :(得分:2)

David Ansermot说得对,xcassets是一种更好的方法,非常受欢迎。如果您不能使用它(例如在旧版本的iOS上运行),仍然将所有内容放在一个目录中并使用imageNamed:。与手动加载文件相比,这具有显着的缓存优势。

asset catalog(xcassets)是一种(相对)新的统一管理图像资源的方式。这些图像不再可以作为磁盘上的单独文件访问。相反,imageNamed:会查询资产目录并获取正确的资产。

在资产目录之前(对于非图像),资产存储在本地化目录中。所有未本地化的资产都将放入名为Resources的目录中(无论这些文件在源树中的位置如何,无论这些文件如何排列在Xcode文件夹中)。本地化文件将存储在English.lprojFrench.lproj等目录中。当您NSBundle调用加载MyImage时,它会按用户配置的顺序查看每个本地化目录,如果在任何这些目录中找不到它,它会查找{{1} }。

现在可以将完整目录存储为"资源"通过在Xcode中将它们标记为目录引用。在这种情况下,整个目录将被复制到Resources或相应的本地化目录中。要在此类目录中查找文件,您可以使用Resources版本的...inDirectory:方法。 因此,大多数情况下,您只想使用NSBundle,它将从资产目录中获取内容(如果可用),然后搜索本地化目录,然后查看imageNamed:。如果您需要查找非图像,或者由于某种原因您想要文件的真实路径,您可以像这样计算它:

Resources

如果该资源位于目录树中(因为它是Xcode中的目录引用),您可以像这样访问它:

NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon" ofType:@"png"];

答案 1 :(得分:0)

以下是我的某个应用中的代码示例:

NSString *appKey = @"Applications__GENERIC";
NSString *path = [[NSBundle mainBundle] pathForResource:appKey ofType:@"plist"];
appData = [NSDictionary dictionaryWithContentsOfFile:path];

“Applications__GENERIC.plist”存储如下:
enter image description here


其他解决方案: 使用images.xcassets。 然后在您的代码中加载图像,使用代码:

UIImage *image = [UIImage imageNamed:@"MyImageWithoutExtension"];

不要放任何路径或扩展名,只放置图片的名称

答案 2 :(得分:0)

尝试使用:

NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon" ofType:@"png" inDirectory:@"Raymio_android_images/MSB_big_icon.imageset"];

您还可以进行调试的是打印出来

[[NSBundle mainBundle] bundleURL]

然后导航到该文件夹​​,查看文件夹结构是否与您使用的路径相对应。

我今天只是苦苦于此,希望它也适合你。