我设置了一个音乐曲目,在ViewController.h和.m文件中播放,如下所示。我想在加载新场景时停止此操作。 (.H):
@interface ViewController : UIViewController<AVAudioPlayerDelegate>{
AVAudioPlayer *startingMusic;
}
@property (nonatomic, retain) AVAudioPlayer *startingMusic;
@end
然后.m
@synthesize startingMusic;
- (void)viewDidLoad
{
[super viewDidLoad];
NSString *music = [[NSBundle mainBundle] pathForResource:musicTrack ofType:@"mp3"];
startingMusic=[[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:music] error:NULL];
startingMusic.delegate=self;
startingMusic.numberOfLoops=-1;
[startingMusic play];
}
然后尝试在新场景加载时使用此代码在init方法中使用另一个名为PlayLevel.m的类来停止播放。
ViewController *test = [[ViewController alloc] init];
[test.startingMusic stop];
然而,当新的加载时,音乐会继续播放。有什么建议吗?
答案 0 :(得分:2)
当您ViewController *test = [[ViewController alloc] init];
创建新的ViewController实例时,这意味着您现在在内存中有两个ViewController对象。
您真正需要做的就是在当前的电话上拨打stop
。
如果您要停止与您的ViewController
无关的其他控制器的音乐,您可以尝试通过通知执行此操作。
例如:
在您的ViewController.h
文件中,导入后:
static NSString * const kStopMusicNotificationName = @"kStopMusicNotificationName";
在ViewController viewDidLoad:
[NSNotificationCenter.defaultCenter addObserverForName:kStopMusicNotificationName object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
[self.startingMusic stop];
}];
当你需要停止音乐时:
[NSNotificationCenter.defaultCenter postNotificationName:kStopMusicNotificationName object:nil];
答案 1 :(得分:1)
你是以错误的方式解决这个问题,你应该在ViewController
内停止音乐,而不是从另一个班级停止。 ViewController应尽可能自包含。
你是如何加载第二个场景的?我想你正在使用Segue?
如果您使用的是segue,则可以覆盖-prepareForSegue
函数UIViewController
。然后在-prepareForSegue
内停止音乐。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Stop Music
}