- [NSBundle pathForResource:ofType]对10.7和10.8上的目录的工作方式不同

时间:2013-09-07 22:57:05

标签: objective-c macos cocoa appkit nsbundle

我有这个代码

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。

2 个答案:

答案 0 :(得分:0)

此解决方案适用于两种操作系统):

[[NSBundle mainBundle] pathForResource:[[path pathComponents] lastObject]
                                ofType:nil
                           inDirectory:[path stringByDeletingLastPathComponent]];

注意:lastObjectstringByDeletingPathComponents 在这种情况下很不错,因为没有超出索引的崩溃,而是返回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中的(未记录的?)扩展名;除非您发现它已被记录,否则最好避免使用它。