从 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 获取零路径的主要内容,如果未能解决你的问题,请参考以下文章
从不是 mainBundle 的 NSBundle 获取文件路径
在 iOS 中获取资产文件的路径:缺少 NSBundle [重复]