Ios NSbundle pathforresource找不到文件

Ios NSbundle pathforresource找不到文件,ios,objective-c,Ios,Objective C,我在复制包资源中列出了images.xcsets,并且在尝试在images.xcsets中添加路径之前,我尝试只声明文件名:MSB_big_icon 谁能告诉我我做错了什么 NSString *path = [[NSBundle mainBundle]pathForResource:@"/Raymio_android_images/MSB_big_icon.imageset/MSB_big_icon" ofType:@"png"]; NSLog(@"path: %@", path); MSBIc

我在复制包资源中列出了images.xcsets,并且在尝试在images.xcsets中添加路径之前,我尝试只声明文件名:MSB_big_icon

谁能告诉我我做错了什么

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];

下面是我的一个应用程序的代码示例:

NSString *appKey = @"Applications__GENERIC";
NSString *path = [[NSBundle mainBundle] pathForResource:appKey ofType:@"plist"];
appData = [NSDictionary dictionaryWithContentsOfFile:path];
“Applications\uuu GENERIC.plist”的存储方式如下:


其他解决办法: 使用images.xcsets。 然后在要加载图像的代码中,使用以下代码:

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

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

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

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

在资产目录之前(对于非图像,仍然如此),资产存储在本地化目录中。所有未定位的资产都将放在一个名为
Resources
的目录中(无论这些文件在源代码树中的位置如何,也不管这些文件在Xcode文件夹中的排列方式如何)。本地化文件将存储在
English.lproj
French.lproj
等目录中。当您调用
NSBundle
来加载
MyImage
时,它会按照用户配置的顺序查看每个本地化目录,如果在这些目录中找不到,它会在
资源中查找

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

NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon" ofType:@"png"];
NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon"
                                                 ofType:@"png" 
                                            inDirectory:@"Raymio_android_images/MSB_big_icon.imageset"];
如果该资源位于目录树中(因为它是Xcode中的目录引用),则可以如下方式访问它:

NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon" ofType:@"png"];
NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon"
                                                 ofType:@"png" 
                                            inDirectory:@"Raymio_android_images/MSB_big_icon.imageset"];
尝试使用以下方法:

NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon" ofType:@"png" inDirectory:@"Raymio_android_images/MSB_big_icon.imageset"];
调试时还可以打印输出

[[NSBundle mainBundle] bundleURL]
然后导航到该文件夹,查看文件夹结构是否与您使用的路径对应


我今天只是在努力解决这个问题,希望它也能为您解决。

我对+imageWithContentsOfFile感兴趣,因为这是一个示例应用程序中使用的方法,因此我想知道它是如何工作的(或不工作的)。我已经创建了一些像你所发布的图片,但是我对为什么我不能获得上面的工作感兴趣。可以添加扩展名,所以没有必要建议图片的名称必须没有扩展名。更新了我的答案@holex,如果你使用xcassets,你不必这么做。仅图像资产名称;)但由于images.xcsets列在复制包资源下,我想我最好从这个位置开始。与此同时,我想知道为什么bundlePath返回与bundleURL相同的路径,但使用不同的键,也许我只能求助于使用标准,我后脑勺里有一句唠叨,我没有让它工作。如果在复制捆绑资源下列出了某些内容,这意味着将列出的文件夹添加到捆绑中,然后可以通过NSBundle使用,这一理解是否有误?因为尽管images.xcsets位于“复制捆绑资源”列表中,但使用上一个代码段仍然无效。如果将文件放入“复制捆绑资源”中,它将位于根文件夹中。它上面的所有子目录都将被剥离。如果你想保留目录,你必须复制目录本身(我记得,已经有一段时间了),你必须使目录成为“目录引用”而不是“文件夹”。但是,既然它已经在根文件夹中,为什么Xcode还要麻烦已经添加了文件和图像.xcsets来复制捆绑资源呢,另一方面,根文件夹中有各种不在复制包中的文件夹/文件。从您的评论中可以看出,当您需要将应用程序根文件夹之外的文件夹添加到应用程序时,复制包资源的作用更大,对吗?不管怎样,我仍然有点困惑,为什么这种方法仍然不起作用。@DevilInDisguise我不确定你看到了什么。构建中的复制文件步骤通常会自动包含所有资源。您应该在没有目录的情况下访问这些资源(因为Xcode默认情况下只使用本地化目录结构,它不创建任何其他目录)。如果您的资产位于xcassets中,您肯定不会使用inDirectory示例。只需使用imagename:也许image.xcsets是我无法使用此方法的原因?正如我在另一篇评论中提到的,我已经在使用imageNamed,但是我想知道为什么我不能用imageWithContent来定位它。。。。无论如何谢谢你的帮助