2013-09-07 4 views
0

У меня был этот код- [NSBundle pathForResource: OfType] работает по-разному для каталогов на 10,7 и 10,8

NSString *path = @"foo/bar"; // Note this is a directory, not a file! 
NSString *pathInBundle = [[NSBundle mainBundle] pathForResource:path ofType:nil]; 

Он работал отлично на 10,8 (возвращение на путь, найденный в комплекте), но вернулся ноль в 10.7.

ответ

0

Это решение работает в обоих операционки):

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

Примечание: lastObject и stringByDeletingPathComponents хороши в этом случае, потому что не врезаться с индексом из границы, а возвращение ноль!

Первоначально я думал, что это будет сделать, но это делает НЕ:

[[NSBundle mainBundle] pathForResource:nil ofType:nil inDirectory:path]; 

Это возвращает первый элемент, найденный в пути (файл или папку), которая полностью не то, что я хотел ,

Я предполагаю, что Apple «улучшила» реализацию pathForResource:ofType: с 10.8, чтобы заставить ее работать с каталогами, поэтому, в зависимости от того, насколько вы по-прежнему нуждаетесь в поддержке 10.7, вы знаете, что вам следует использовать.

Возможно, мне не хватает чего-то очевидного, как более простой способ вернуть каталог (опять же, в 10.7, поскольку в 10.8 это очень просто, как я заявляю в вопросе).

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; было бы лучше избегать его использования, если вы не обнаружите, что оно задокументировано.