2012-11-24 5 views
0

J'essaie de changer le volume d'un effet sonore via une variable. J'utilise AVAudioPlayer et j'appelle la variable pour régler le volume, mais quand je lance l'application, je n'obtiens aucun son, quel que soit le réglage de la variable. (.1-1.0) Cependant, si je place le numéro depuis le bloc AvAudioPlayer (player.volume = .5;), il répond comme il se doit. Des idées de ce que je fais mal?Volume AVAudioPlayer à partir de la variable

Exemple de mon code:

@interface 

@property (nonatomic) float setVolume; 

@implementation 
@synthesize setVolume; 

float setVolume = .5; 

-(void)countdown 
{ 
//play sound 
NSString *musicFilePath = [[NSBundle mainBundle] pathForResource:@"Countdown_beep" ofType:@"wav"]; 
NSURL *musicURL = [[NSURL alloc] initFileURLWithPath:musicFilePath]; 
player = [[AVAudioPlayer alloc] initWithContentsOfURL:musicURL error:nil]; 
player.volume = setVolume; 
[player play]; 

Merci. :)

EDIT:

Je résolu le problème en supprimant la déclaration du fichier d'en-tête et la création du Ivar au sein de la mise en œuvre.

+0

Un C global (variable externe) n'est pas un ivar. – matt

Répondre

0

Cette ligne n'a pas de sens et n'a rien à voir votre programme:

float setVolume = .5; 

Vous synthétisent déjà une propriété/Ivar appelé setVolume. Ce n'est pas ça. Donc, par défaut, votre propriété setVolume est zéro et vous ne faites rien pour changer cela, donc le volume se termine par zéro et aucun son ne se produit.

Pour définir la valeur de la propriété, définissez la valeur de la propriété. :) Par exemple, vous pourriez dire self.setVolume = .5. Vous pouvez le faire plus tôt dans la méthode countdown, par exemple, ou dans une autre méthode (l'un des points d'une propriété est que toutes les méthodes de cet objet peuvent le voir).

Maintenant, un autre problème avec votre code est que votre nom de propriété commence par "set". C'est probablement une mauvaise idée. Si j'étais vous, je choisirais un autre nom. Les noms de la forme "setX" sont mieux utilisés seulement comme le nom d'une méthode setter pour une variable d'instance/propriété X.

+0

Merci, Matt. Mon seul problème avec dire 'self.setVolume = .5;' dans la méthode est que cette variable définit le volume pour de nombreuses instances de l'effet sonore appelé à partir de différentes méthodes et il y a beaucoup plus de travail à passer et à changer séparément plutôt que de lier le volume de AVAudioPlayer à une variable. Aussi, je suis d'accord pour éviter 'set' dans les noms de var, je l'ai juste fait ici pour le code de l'exemple. – Andrewb

+0

Je suppose que ma question est alors qu'est-ce que j'écris pour changer la valeur de 'setVolume' de l'extérieur d'une méthode? – Andrewb

+0

Quel sens pourrait-il avoir pour changer la valeur de 'setVolume' de l'extérieur d'une méthode? Les méthodes sont votre code - elles sont ce qui fonctionne. Votre travail consiste à mettre ce code dans des méthodes qui fonctionneront au bon moment. Par exemple, si vous voulez que ce soit la valeur par défaut de votre variable d'instance pour chaque instance de cette classe qui existe, remplacez la méthode d'initialisation désignée et définissez la valeur ici. Je suis un peu inquiet que vous ne compreniez pas quelles méthodes et variables d'instance * sont *. Tu dois. – matt

Questions connexes