我有这个代码
NSString *path = @"foo/bar"; // Note this is a directory, not a file!
NSString *pathInBundle = [[NSBundle mainBundle] pathForResource:path ofType:nil];
它在10.8上运行正常(返回包中找到的路径)但在10.7中返回nil。
答案 0 :(得分:0)
此解决方案适用于两种操作系统):
[[NSBundle mainBundle] pathForResource:[[path pathComponents] lastObject]
ofType:nil
inDirectory:[path stringByDeletingLastPathComponent]];
注意:lastObject
和stringByDeletingPathComponents
在这种情况下很不错,因为没有超出索引的崩溃,而是返回nil!
最初我认为这会成功,但不:
[[NSBundle mainBundle] pathForResource:nil ofType:nil inDirectory:path];
这将返回在路径(文件或文件夹)中找到的第一个元素,这完全不是我想要的。
我猜Apple从10.8开始“调整”了pathForResource:ofType:
的实现,以使其与目录一起使用,所以根据是否需要支持10.7,你知道应该使用什么。
也许我错过了一些明显的东西,比如回到目录的一种更简单的方法(再次,在10.7中,因为在10.8中它就像我在问题中说的那样非常容易)。
答案 1 :(得分:0)
以下内容适用于查找捆绑软件子目录中任何项目的路径,包括10.6中的相应本地化变体 - > 10.8至少:
// long hand...
NSString *item = [path lastPathComponent]; // path/item -> item
NSString *itemBase = [item stringByDeletingPathExtension]; // base[.ext] -> base
NSString *itemExtension = [item pathExtension]; // base[.ext] -> ext or @""
NSString *pathDirectory = [path stringByDeletingLastPathComponent]; // path/item -> path
NSString *pathInBundle = [[NSBundle mainBundle] pathForResource:itemBase
ofType:itemExtension
inDirectory:pathDirectory];
pathForResource:
作为路径的限额似乎是10.8中的(未记录的?)扩展名;除非您发现它已被记录,否则最好避免使用它。