从 NSBundle 获取零路径

Posted

技术标签:

【中文标题】从 NSBundle 获取零路径【英文标题】:Getting a nil path from NSBundle 【发布时间】:2012-07-29 02:09:50 【问题描述】:

我在我的项目中创建了一个新文件夹,我在其中复制了一张图片(称为“io.jpg”)。 我还检查了构建阶段 -> 复制捆绑资源并且文件在那里。 所以我正在尝试获取此图像的路径:

NSBundle* bundle=[NSBundle mainBundle];
NSString* path=[bundle pathForResource: @"io" ofType: @"jpg"];
NSLog(@"%@",path);

但它打印(null),我也尝试过这种方式:

NSBundle* bundle=[NSBundle mainBundle];
NSString* path=[bundle pathForImageResource: @"io"];
NSLog(@"%@",path);

但它仍然打印 (null)。 有什么问题?

【问题讨论】:

您是否查看了实际构建的产品以确保文件被正确复制? 是的,文件在app目录下。 resourcePath not working Xcode 的可能重复项 在那个问题中没有答案(复选框目标会员已被选中),所以我不认为它是重复的。 1) [NSBundle mainBundle] 是否返回非零? 2)您是否尝试过 URLforResource ? (疯狂猜测) 【参考方案1】:

转到:目标->“构建阶段”->“复制捆绑资源”然后在此处添加该特定文件。

清理项目并运行。有用。 :)

【讨论】:

【参考方案2】:

我的猜测是,鉴于您说您在 Xcode 项目中创建了一个新的文件夹,您已经创建了一个蓝色文件夹引用,并且您的图像资源位于 bundle 的子目录中。 p>

我愿意打赌这不是 NSBundle 的错误,因为这个类对于 Foundation 框架来说是多么古老和重要。

尝试使用更具体的实例方法访问您的资源

- (NSString *)pathForResource:(NSString *)name ofType:(NSString *)extension inDirectory:(NSString *)subpath

subpath文件夹引用的名称我猜是你创建的。

【讨论】:

【参考方案3】:

如果您请求的资源在输出中不存在(或在应有的位置不存在),您将获得一个 nil 路径。这真的是我见过的唯一原因。

忘记证明它应该存在,只需检查输出以确保它存在。

(请记住,文件名区分大小写。)

为了澄清,您应该查看~/Library/Developer/Xcode/DerviedData/Project-GUID/Build/Products 中的输出包。您的图片将丢失。

【讨论】:

图片在那里,我也尝试打印捆绑包的路径,并进入它的目录,我注意到在 Contents->Resources 下有图像“io.jpg”。 它应该在 YourApplication.app 的顶层,而不是在 Resources 子目录中。 @StevenFisher 我正在使用 Xcode 6 - 我在哪里可以看到资源文件?它们不在 Products 或 Debug-iphonesimulator 中。 单个图形在应用程序包内:控制点击如上。如果您使用资产目录,您将看不到它们;等效的是 Assets.car 文件。你可能最好用你的图像截图(在资产包/项目中)和你用来尝试访问它们的代码提出一个新问题。现在情况大不相同了。【参考方案4】:

几周前我遇到了这样的问题。事实证明我只是没有勾选一个框。这是我问的时候得到的答案。

“在 Xcode Project Navigator 中选择文件(左侧),并确保在 File Inspector(右侧)中的“Target Membership”下检查了您的目标。 -- 还要仔细检查文件名 – Mundi"

【讨论】:

所以这个问题是那个问题的重复? 是的。如果您忘记选中该框,则该文件实际上不会在应用程序的包中。【参考方案5】:

如果您只是想获得一张图片,那么所有这些都有点矫枉过正。假设您已将 bundleImage.PNG 包含在您的应用程序包中......某处,不知何故......

NSImage *image = [NSImage imageNamed:@"bundleImage"];

肯定会……找到它……如果它在那里……再简单不过了,对吧?

如果 - 机会不大 - 这是一个稍微复杂一点的情况,例如图像位于可加载的包或框架中 - 您可以使用类似于以下的代码(NSImage 上的类类别)这也将返回资源。

+ (id) imageInFrameworkWithFileName:(NSString *) fileName 
   NSBundle *b = [NSBundle bundleForClass: [DummyClass class]];
   return [self imageWithFileName: fileName inBundle: b];

说实话,我并不真正理解这种“虚拟类”的概念或如何工作......但这就是它的样子

@interface DummyClass : NSObject
@end
@implementation DummyClass 
@end

【讨论】:

假设 'DummyClass' 作为您要查找的图像资源也在捆绑包/框架中。 @Jessedc 不,我只是在@interface NSImage (MyCategory) 之前包含@interface DummyClass,然后我可以在任何继承了#import'ed 类别的地方使用它..【参考方案6】:

尝试从您的应用程序中删除图像。然后再次添加它。并在运行之前清理您的构建。看看它是否有帮助。否则,请提供您的项目导航器的屏幕截图,显示图像添加的位置。它必须在您的 Application.app 的顶层。它是否位于任何文件夹/子文件夹中。

【讨论】:

以上是关于从 NSBundle 获取零路径的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中从 NSBundle 获取文件路径

从不是 mainBundle 的 NSBundle 获取文件路径

在 iOS 中获取资产文件的路径:缺少 NSBundle [重复]

无法在 NSBundle 中获取图像路径?

给定应用程序的完整路径或 NSBundle 实例,如何获取其图标?

NSBundle