从iOS的Resources文件夹中随机选择一个文件

时间:2011-01-03 14:06:01

标签: iphone arrays cocoa-touch ios

我在iOS 4.2 XCode项目的.mp3文件夹中有一千个Resources个文件。

现在我可以在我的.m文件中使用以下代码从文件夹中选择一个文件(并播放它):(给定文件名“AFile.mp3”)

   -(IBAction)playSound {

        NSString *path = [[NSBundle mainBundle] pathForResource:@"AFile"ofType:@"mp3"];

        AVAudioPLayer* theAudio =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];

        theAudio.delegate = self;
        [theAudio play];
}

我希望能够让代码随机选择一个.mp3,播放它,然后选择另一个文件并播放它们,直到它们至少播放一次。我假设我需要使用NSArray,但不确定如何处理。

我将代码更改为以下内容,并且在iOS模拟器中运行时没有出现任何错误。虽然我运行它时没有文件播放?当我启动应用程序时,它会退出,但不会在调试器中记录任何错误..

更新代码:

-(IBAction)playSound {

NSArray *array = [[NSBundle mainBundle] pathsForResourcesOfType:@".mp3" inDirectory:@"Resources"];
NSString *randomPath = [array objectAtIndex:arc4random() % [array count]];

AVAudioPlayer* theAudio =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: randomPath] error: NULL;
    theAudio.delegate = self;
    [theAudio play];

}

我如何设置1000个.mp3文件的简单数组,并让方法随机播放?

5 个答案:

答案 0 :(得分:3)

AVAudioPlayer* theAudio=[[AVAudioPlayer alloc]initWithContentsofURL: [NSURL arrayURLWithPath:array] error:NULL];

应该是:

AVAudioPlayer* theAudio=[[AVAudioPlayer alloc]initWithContentsofURL: [NSURL URLWithString:[array objectAtIndex:11]] error:NULL];

因此数字'11'是随机文件路径。要获得随机性,您可以使用:

int randomNumber = random()%1000; // random number between 0 and 1000

然后使用randomNumber代替11

要播放每个文件只有一次你可以播放让我们说一次第四首歌曲,然后从你的阵列中删除这个项目。下次生成随机数时,请使用999而不是1000,依此类推,直到达到1。

//编辑:尝试以下:

-(IBAction)playSound {

    NSArray *array = [[NSBundle mainBundle] pathsForResourcesOfType:@".mp3" inDirectory:@"Resources"];
    int rndm = arc4random() % [array count];
    if (rndm<0) rndm*=-1;
    NSString *randomPath = [array objectAtIndex:rndm];

    AVAudioPlayer* theAudio =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: randomPath] error: NULL;
    theAudio.delegate = self;
    [theAudio play];

}

答案 1 :(得分:3)

使用此代码段。来自a previous SO answer

NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSArray *dirContents = [[NSFileManager defaultManager] directoryContentsAtPath:bundleRoot];
NSArray *onlyJPGs = [dirContents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self ENDSWITH '.jpg'"]];

然后获取数组计数..并使用随机获取随机整数和文件。

答案 2 :(得分:1)

好吧,如果您已经有一个对要从中检索随机元素的数组的引用,那么它很简单:

NSString *randomPath = [array objectAtIndex:arc4random_uniform([array count])];

此外,arc4random() is much better than rand()

答案 3 :(得分:1)

在查看苹果文档后,这是错误的。不知怎的,即使我们指定一个自定义目录,它似乎只是供参考。我发现的另一个错误是我们只需要指定没有“。”的扩展名。

NSArray * audioPathArray = [[NSBundle mainBundle] pathsForResourcesOfType:@“mp3”inDirectory:nil];

NSLog(@"%d",[audioPathArray count]);

NSString *path = [audioPathArray objectAtIndex:arc4random() % [audioPathArray count]];

NSURL *randomPath = [[NSURL alloc]initFileURLWithPath:path]; 

AVAudioPlayer *theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:randomPath error:NULL];


[theAudio play];

这对我有用。希望它可以帮助你。

答案 4 :(得分:0)

了解我的项目

将Resources文件夹导入项目时,选择“为任何添加的文件夹创建文件夹引用”。这实际上将维护[NSBundle mainBundle]中的目录结构。

然后您可以像这样拉出内容:

NSString * bundlePath = [NSBundle mainBundle] bundlePath];
NSString * resourceFolderPath = [NSString stringWithFormat:@"%@/Resources", bundlePath];
NSArray * resourceFiles = [[NSFileManager defaultManager] directoryContentsAtPath:resourceFolderPath error:nil];

resourceFiles应该包含Resources目录的内容列表。

NSInteger randomFileIndex = arc4random() % [resourceFiles count];
NSString * randomFile = [resourceFiles objectAtIndex:randomFileIndex];