Elija un file de forma aleatoria desde la carpeta Recursos en iOS

Tengo mil files .mp3 en mi carpeta de Resources dentro de un proyecto iOS 4.2 XCode.

Por ahora, puedo seleccionar un file de la carpeta (y reproducirlo) con el siguiente código en mi file .m : (Dado el nombre del file "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]; } 

Me gustaría poder hacer que el código elija un .mp3 aleatoriamente, jugarlo, luego seleccionar otro file y jugarlos todos hasta que se hayan jugado al less una vez. Supongo que necesitaré utilizar un NSArray, pero no estoy seguro de cómo proceder.

Cambié el código a lo siguiente, y no recibí ningún error cuando ejecuté esto en el simulador de iOS. Aparentemente no se reproduce ningún file cuando lo ejecuto? Cuando inicio la aplicación, se cierra, pero no registra ningún error en el Depurador.

Código actualizado:

 -(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]; } 

¿Cómo puedo configurar una matriz simple de los files .mp3 1000 y hacer que el método juegue uno random?

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

debiera ser:

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

por lo tanto, el número '11' es una ruta de file aleatoria. Para get aleatoriedad puedes usar esto:

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

y luego usa randomNumber lugar de 11

Para reproducir cada file solo una vez, puedes tocar digamos el número de canción cuatro una vez y luego eliminar este elemento de tu matriz. La próxima vez que genere un número aleatorio, use 999 en lugar de 1000 y así hasta que llegue a 1.

// EDIT: intente seguir:

 -(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]; } 

Utilice este fragment. de una respuesta SO anterior

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

luego obtenga el recuento de la matriz … y use aleatoria para get el número integer y el file aleatorios.

Ok, después de mirar los documentos de la manzana, aquí está el error. De alguna manera, incluso si especificamos un directory personalizado, parece ser solo para reference. El otro error que he encontrado es que solo necesitamos especificar la extensión sin el "."

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]; 

Esto es lo que funcionó para mí. Espero que te ayude.

Bueno, si ya tiene una reference a la matriz en la que desea recuperar un elemento aleatorio, entonces es bastante simple:

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

Además, arc4random() es mucho mejor que rand()

Lo tengo trabajando en mi proyecto

Cuando importe la carpeta Recursos a su proyecto, select "Crear references de carpetas para cualquier carpeta agregada". Esto realmente mantendrá la estructura de directorys en su [NSBundle mainBundle].

A continuación, puede extraer los contenidos de la siguiente manera:

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

resourceFiles debe contener una list de los contenidos de su directory de resources.

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