Bundle子目录访问

时间:2012-06-19 11:55:53

标签: ios objective-c avaudioplayer nsdata

我试图在我的程序中实现改变界面的能力,比如主题。我决定使用捆绑包,所以在我的情况下它们看起来像这样:

  • Theme1.bundle
  • Theme2.bundle

每个捆绑包都有文件夹:

  • Theme1.bundle
    • 图形
      • pic1.png
      • pic2.png
      • sound1.wav
      • sound2.wav

所以我可以通过这段代码从包中找到任何所需图片的路径:

path = [NSString stringWithFormat:@"%@.bundle/graphic/%@", selectedBundle, imageName];

当我从捆绑中获取图片时没有问题,路径看起来像这样(我使用断点检查): Theme1.bundle / graphic / pic1.png ,我创建UIImage

image = [UIImage imageNamed:path];

图片加载没有任何问题。
但是当我尝试使用AVAudioPlayer播放声音时,我通过相同的方式获得声音路径,并且路径如下所示: Theme1.bundle / sound / sound1.wav ,但是当我尝试创建NSData时

sound = [NSData dataWithContentsOfFile:path];

它未初始化。
当我试图将声音保持在主束中并通过

获取
path = [[NSBundle mainBundle] pathForResource:@"sound1" ofType:@"wav"];

一切都很好,路径看起来像这样
/var/mobile/Applications/E8313E88-CE05-44B2-A80C-B05331D8596F/Myapp.app/sound1.wav

我无法理解为什么这适用于图片而不是声音?
为什么我不能从捆绑声中获得声音? 我只能建议一件事 - imageNamed:做一些工作来找到正确的文件路径而dataWithContentsOfFile:没有。

1 个答案:

答案 0 :(得分:1)

在您的代码中而不是

sound = [NSData dataWithContentsOfFile:path];

使用

NSString * path = [NSString stringWithFormat:@"%@.bundle/sounds/%@", selectedBundle, soundName]; 
NSString *fullPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:path];
sound = [NSData dataWithContentsOfFile:path];

说明: ImageNamed将应用程序的路径附加到您指定的图像名称