我正在尝试在我的应用程序中播放音乐.音乐工作正常,但在切换viewControllers并返回主菜单后,我的音乐再次播放!这意味着几个相同的声音一起播放!我怎么解决这个问题?这是我的代码:
- (void)viewDidLoad { Nsstring *music = [[NSBundle mainBundle] pathForResource:@"1music" ofType:@"mp3"]; myMusic = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:music] error:NULL]; myMusic.delegate = self; myMusic.numberOfLoops = -1; [myMusic play]; } - (IBAction) scoreView { scoreViewController *scoreView = [[scoreViewController alloc] initWithNibName:@"scoreViewController" bundle:nil]; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:1]; [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES]; [self.view addSubview: scoreView.view]; [UIView commitAnimations]; }
编辑代码:
- (id)initWithNibName:(Nsstring *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { Nsstring * musicSonati = [[NSBundle mainBundle] pathForResource:@"music" ofType:@"mp3"]; myMusic = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:musicSonati] error:NULL]; myMusic.delegate = self; myMusic.numberOfLoops = -1; [myMusic play]; } return self; } //toggle button - (IBAction)MusicPlaying:(id)sender { if ((isPlay = !isPlay)) { UIImage *buttonImagenormal = [UIImage imageNamed:@"play.png"]; UIImage *stretchableButtonImagenormal = [buttonImagenormal stretchableImageWithLeftCapWidth:0 topCapHeight:0]; [MusicButton setBackgroundImage:stretchableButtonImagenormal forState:UIControlStatenormal]; [myMusic pause]; }else { UIImage *buttonImagenormal = [UIImage imageNamed:@"pause.png"]; UIImage *stretchableButtonImagenormal = [buttonImagenormal stretchableImageWithLeftCapWidth:0 topCapHeight:0]; [MusicButton setBackgroundImage:stretchableButtonImagenormal forState:UIControlStatenormal]; NSLog(@"Music play"); [myMusic play]; } }
解决方法
确保myMusic被正确声明为保留属性并合成然后尝试这样的事情:
-(void) commonInit { Nsstring * musicSonati = [[NSBundle mainBundle] pathForResource:@"music" ofType:@"mp3"]; self.myMusic = [[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:musicSonati] error:NULL] autorelease]; self.myMusic.delegate = self; self.myMusic.numberOfLoops = -1; //You probably don't want to play music on init,rather defer to viewDidLoad. // [self.myMusic play]; } - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; if (self) { [self commonInit]; } return self; } - (id)init { self = [super init]; if (self) { [self commonInit]; } return self; } - (id)initWithNibName:(Nsstring *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { [self commonInit]; } return self; }
然后在viewDidLoad中尝试:
- (void)viewDidLoad { ... if (!self.myMusic.playing) { [self.myMusic play]; } ... }
另外,不要忘记以dealloc发布你的播放器!