2

我正在开发一个应用程序,我将一个包含图像的文件夹拖放到我的 Xcode 项目中。

当应用程序启动时,我会收集应用程序中图像的所有文件名,以便稍后延迟加载它们:

-(NSArray *)fetchImagesInFolder:(NSString *)folderName{

    NSArray *allImagesArray = [NSArray arrayWithArray:[[NSBundle mainBundle] pathsForResourcesOfType:nil inDirectory:folderName]];

    if([allImagesArray count] == 0){
        NSLog(@"No images found in %@", folderName);
        return nil;
    }

    return allImagesArray;
}

这是我的问题:这只适用于 1 次 4 次。4 次中有 3 次[allImagesArray count]是 0。

然后我必须从项目中删除文件夹,再次拖放它,如果我之前选择了“为任何添加的文件夹创建组”,我将选择“为任何添加的文件夹创建文件夹引用”,反之亦然,清理,构建,然后运行。该解决方案在 4 次中有 3 次有效。

如果我右键单击项目生成的 .app 文件,然后单击“显示包内容”,则图像始终存在。但是,为什么pathsForResourcesOfType:inDirectory:如此不可靠呢?

4

2 回答 2

3

您是否查看了目标的构建阶段“复制捆绑资源”部分,并了解系统如何将图像移动到捆绑中?我希望它不会复制文件夹本身,而只是将各种图像移动到一个公共目录中。

如果是这样,假设你有所有'jpg'或所有'png',然后使用适当的后缀(比如'jpg')并执行以下操作:

[NSBundle mainBundle] pathsForResourcesOfType:@"jpg" inDirectory:nil];

如果事实上你已经说服 Xcode 在包中创建一个目录,那么像现在一样添加名称,但不要管类型。

如果您有混合图像类型,则每次执行一次上述命令,然后将数组组合成一个超级数组。

编辑:如果您想将图像存储在各种文件夹中,我相信您需要编写一个“运行脚本”shell 脚本来执行您想要的操作。虽然我自己没有做过这种技术,但我相信这是其他人在解决同样问题时所做的:

  • 不要在目标中包含任何图像(取消选中全部) - 您将自己管理它们
  • 添加一个图像 - 一些 jpeg - 并查看 Copy Bundle Resources 将其移动到何处。我记得它只是被移动到主包目录但又不确定。
  • 创建一个空的运行脚本,并选中该框以转储环境 - 您将在那里看到所有各种定义,并可以找到指向正确目录的定义(因此您可以在脚本中使用它)
  • 使用上面找到指向顶级项目目录的变量,因此您可以导航到您的图像文件夹
  • 现在使用变量编写运行脚本,找到项目中的所有图像文件夹,然后将它们复制到应用程序包中的适当位置。您想使用变量,因为模拟器和真实应用程序的路径不同。

您将在此处和网络上找到编写“运行脚本”的示例。我永远不记得要使用哪些 Xcode 环境变量,所以总是只转储一个集合然后四处寻找。使用任何一个名称,您都可以使用谷歌搜索并找到提供更多信息的 Apple 文档。

于 2012-09-11T11:53:50.667 回答
1

问题是我在添加文件夹时选择了“为任何添加的文件夹创建文件夹引用”,然后尝试通过

    UIImage *img = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", 
                                                      [[NSBundle mainBundle] resourcePath], imageName]];

但这仅在图像位于 .app 的根目录中时才有效,如果您选择“为任何添加的文件夹创建组” ,就会发生这种情况。

就我而言,我想保留原始目录结构,所以我通过在我给的参数中包含图像的路径来解决问题imageWithContentsOfFile

    NSString *imageName = [NSString stringWithFormat:@"%@", [NSString stringWithFormat:@"name-of-my-images-rootdirectory/%@/%@", [NSString stringWithFormat:@"%@", subdirectoryName], [normalImagesArray objectAtIndex:i]]];
    UIImage *img = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] resourcePath], imageName]];
于 2012-09-11T17:17:55.673 回答