如何使用pathForResource:ofType:inDirectory访问文件

时间:2014-11-29 20:02:31

标签: ios objective-c avfoundation nsurl

我的Supporting Files文件夹中有一个mp3文件,我想在我的应用程序中循环播放。我正在使用以下代码尝试此操作:

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"smoothjazz" ofType:@"mp3" inDirectory:@"Supporting Files"];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
player.numberOfLoops = -1; //infinite
[player play];  

但是,这会返回错误说明:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter'  

如何在支持文件中访问我的文件,并按预期播放?所有帮助赞赏。

编辑:解决了!请参阅我的答案,了解我是如何做到的:)

3 个答案:

答案 0 :(得分:1)

如果Supporting Files文件夹是支持文件组,则默认情况下会在每个Xcode项目中看到,而不需要inFolder:参数,因为Supporting Files是Xcode分组而不是真实文件夹。所以你应该这样做:

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"smoothjazz" 
                                                          ofType:@"mp3"];

这应该有用。

希望它有所帮助。

答案 1 :(得分:0)

可能是你通过的路径将是零,

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"smoothjazz" ofType:@"mp3" inDirectory:@"Supporting Files"];

确保已将文件正确添加到捆绑包中。 并且在提交操作之前添加适当的检查,这是最佳实践。如下,希望这可以帮助你..

// Define NSFileManager and add the proper checks for file existance like as follows.
NSFileManager *filemgr  = [NSFileManager defaultManager];
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"smoothjazz" ofType:@"mp3" inDirectory:@"Supporting Files"];

if (filemgr fileExistsAtPath:imageURL.absoluteString])
{
// Your code to play the sound file
}

答案 2 :(得分:0)

Dan Spag是对的 - 我不需要使用'inDirectory:',因为它在支持文件中。但主要问题是我在viewDidLoad方法中声明了AVAudioPlayer,这意味着它的生命周期只与方法一样长(或者沿着那些方向)。所以我将变量声明为全局变量,问题解决了!音乐播放。