2009-07-31 8 views
0

J'ai un tableau qui crée plusieurs noms de fichiers sonores différents dans un ordre spécifique. J'ai réussi à créer le tableau, mais je ne suis pas sûr de savoir comment appeler la valeur que j'ai reçue du tableau en tant qu'URL du fichier ou comment je l'implémente dans AudioServicesPlaySystemSoundID.Comment appeler une valeur de tableau et l'utiliser pour lire un fichier son?

C'est le code que j'ai jusqu'à présent:

 - (void)viewDidLoad { 
      NSArray *sounds = [[NSArray alloc] initWithObjects: @"0.wav", @"1.wav", @"2.wav, nil]; 
      NSUInteger currentSound = 0; 
      soundArray = sounds 
      [super viewDidLoad]; 
     } 

     - (void) playFailSound { 
      currentSound++; 
      if (currentSound >= [sounds count]) { 
       currentSound = 0; 
      } 
      [self playSoundWithFilename:[sounds objectAtIndex:currentSound]]; 
     } 

Je suis également pas sûr de ce que je dois déclarer dans le fichier d'en-tête pour que cela fonctionne et comment puis-je stocker la valeur du tableau?

Répondre

0

Demandez-vous comment appeler playFailSound:? Ou demandez-vous comment déclarer le tableau de sons dans votre fichier d'en-tête pour en faire une variable d'instance?

Le premier problème que vous avez est que vous utilisez un nom de variable différent pour le tableau dans les deux méthodes. Dans viewDidLoad vous utilisez soundArray, et dans playFailSound vous utilisez des sons.

Dans votre fichier d'en-tête, vous aurez besoin de déclarer un tableau comme une variable d'instance:

#import <UIKit/UIKit.h> 

@interface MyObject : NSObject { 
    NSArray *_sounds; //declare the variables 
    NSInteger _currentSound; //this doesn't need to be unsigned, does it? 

} 

@property(nonatomic, retain) NSArray *sounds; //property 
@property(value) NSInteger currentSound; //property 


//method declarations 
- (void) playFailSound;  
- (void) playSoundWithFilename:(NSString *)fileName; 

@end 

Vous remarquerez que j'utilisé un trait de soulignement au nom de la variable, mais n'a pas la propriété. De cette façon, vous n'utiliserez pas accidentellement la variable lorsque vous voulez utiliser la propriété.

Dans votre fichier de mise en œuvre, vous aurez besoin des éléments suivants:

#import "MyObject.h" 

@implementation MyObject 

//synthesize the getters and setters, tell it what iVar to use 
@synthesize sounds=_sounds, currentSound=_currentSound; 

    - (void)viewDidLoad { 
     NSArray *tempSounds = [[NSArray alloc] initWithObjects: @"0.wav", 
                  @"1.wav", 
                  @"2.wav, nil]; 
     self.currentSound = 0; //use the setter 
     self.sounds = tempSounds; //use the setter 
     [tempSounds release]; //we don't need this anymore, get rid of the memory leak 
     [super viewDidLoad]; 
    } 

    - (void) playFailSound { 
     self.currentSound=self.currentSound++; //use the getters and setters 
     if (self.currentSound >= [self.sounds count]) { 
      self.currentSound = 0; 
     } 
     [self playSoundWithFilename:[self.sounds objectAtIndex:self.currentSound]]; 
    } 

    - (void) playSoundWithFilename:(NSString *)filename { 
     //you fill this in 
    } 
@end 

Maintenant, tout ce que vous devez faire est d'appeler playFailSound de quelque part, et remplir la partie qui joue en fait le son. Essentiellement, pour que deux méthodes se réfèrent à la même variable qui n'est pas passée entre elles, il doit s'agir d'une variable d'instance.

Ceci est assez basique, donc si vous n'obtenez pas ce que je suis en train d'expliquer ici, je vous suggère de relire certains des documents d'introduction d'Apple.

+1

Ne pas oublier de traiter dealloc. –

+0

Bien sûr, merci! –

Questions connexes