使用 NSBundle 加载我的资源

Posted

技术标签:

【中文标题】使用 NSBundle 加载我的资源【英文标题】:Using NSBundle to load my resources 【发布时间】:2012-12-10 21:58:30 【问题描述】:

我想将我的资源、nib 文件和本地化文件分离到一个通用的可重用包中。因此,我为我的 ios 应用程序创建了一个包,并使用构建阶段指定要包含在包中的资源,复制包资源。但是,现在如果我尝试加载捆绑包,我将无法加载捆绑包。我尝试使用 [NSBundle allBundles] 并且该数组仅显示主应用程序包。

我还尝试枚举 NSApplicationPath 的目录,但唯一可用的包是我的应用程序默认包。我想学习这种技术并利用它来分离我的资源。任何帮助和建议将不胜感激。谢谢

【问题讨论】:

【参考方案1】:
[NSBundle bundleWithPath:[NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] bundlePath], pathToYourBundleWithinTheDotAppDirectory];

让我知道你过得怎么样。

【讨论】:

它不加载包。看起来,捆绑包本身位于主应用程序捆绑包中。所以我必须使用 [[NSBundle mainBundle] pathForResource:@"MyBundle" ofType:@"bundle"] 获取包的路径,然后使用 bundleWithPath: 方法使用路径加载包 但是,我将图像添加到包中并尝试使用 pathForResource:ofType: 方法加载图像,但该方法为 nil,然后我浏览到模拟器应用程序文件夹并看到图像不是复制。 您可能需要在构建中添加“复制文件”阶段。【参考方案2】:

试试这样的:

NSBundle* bundle=[NSBundle bundleWithIdentifier: @"bundle name"];

并确保在将包拖到项目时选择了这些选项:

【讨论】:

我通过将目标添加到现有应用程序来创建捆绑包。【参考方案3】:

对于具有一个捆绑包的项目,我使用:

// in this example, we load test.png from the bundle
NSString *pathToResource = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"png"];

之所以如此方便,是因为当您拥有本地化文件时,它会提供当前用户区域设置的文件路径。这很方便,因为本地化文件不在主目录中,而是在它们自己的子文件夹中(例如,英文本地化文件在 @"en.lproj" 子文件夹中),并且通过名称调用它们很麻烦,因为您需要完整路径。此方法为您获取路径。

【讨论】:

以上是关于使用 NSBundle 加载我的资源的主要内容,如果未能解决你的问题,请参考以下文章

创建 NSBundle

Retina 图形未从 NSBundle 加载

向 NSBundle 询问其资源名称

iOS开发之0行代码加载NSBundle中的@2x与@3x图片

NSBundle的加载和卸载

NSBundle 加载一个 NSViewController