如何停止从 Xcode 播放的不同 class 播放背景音乐?
How to stop background music playing from a different class playing in Xcode?
我已经在 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 的不同 class 时停止播放。
ViewController *test = [[ViewController alloc] init];
[test.startingMusic stop];
然而,当新看到的加载时,音乐会继续播放。有什么建议吗?
你的做法是错误的,你真的应该在 ViewController
中停止音乐,而不是从另一个 class 中停止。 ViewController 应尽可能独立。
你如何加载第二个场景?我想你正在使用 Segue?
如果您使用的是 segue,您可以覆盖函数 -prepareForSegue
,它是一个 UIViewController
函数。在 -prepareForSegue
内停止音乐。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Stop Music
}
当您执行 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];
我已经在 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 的不同 class 时停止播放。
ViewController *test = [[ViewController alloc] init];
[test.startingMusic stop];
然而,当新看到的加载时,音乐会继续播放。有什么建议吗?
你的做法是错误的,你真的应该在 ViewController
中停止音乐,而不是从另一个 class 中停止。 ViewController 应尽可能独立。
你如何加载第二个场景?我想你正在使用 Segue?
如果您使用的是 segue,您可以覆盖函数 -prepareForSegue
,它是一个 UIViewController
函数。在 -prepareForSegue
内停止音乐。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Stop Music
}
当您执行 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];