iPhone: запуск звукового клипа не останавливается при изменении вида

У меня есть приложение, которое при запуске воспроизводит вступительный клип. Следующий код находится в - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions в appDelegate.m, который работает просто великолепно.

NSLog(@"PLAY SOUND CLIP WHILE LOADING APP");
NSURL *clip = [[NSBundle mainBundle] URLForResource: @"intro" withExtension:@"caf"];
self.startupPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:clip error:NULL];
[self.startupPlayer play];

Если пользователь изменит вид до того, как закончится вступительный звук, он все равно продолжит воспроизводиться. Я поместил этот код за пределы - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions, думая, что это поможет, но нет.

-(void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
// Stop Sound
[self.startupPlayer stop];
}

Я подумал, может быть, если я поставлю оператор if сразу после запроса на загрузку, это может помочь, но это не сработало. См. пример:

NSLog(@"PLAY SOUND CLIP WHILE LOADING APP");
NSURL *clip = [[NSBundle mainBundle] URLForResource: @"intro" withExtension:@"caf"];
self.startupPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:clip error:NULL];
[self.startupPlayer play];

if ([viewDidDisappear == YES]) {
[self.startupPlayer stop];
}

Любые предложения, которые остановят вступительный звук, если пользователь изменит представление до того, как этот клип завершит воспроизведение, были бы замечательными. О, и я успешно использовал «viewWillDisappear» в других частях приложения, но в этом случае я выбираю «viewDidDisappear», потому что последний тоже не работал. Так что я в тупике. Заранее спасибо.

РЕДАКТИРОВАТЬ: Итак, я переместил viewWillDisappear в свой MainViewController и вызвал делегата, но мне все еще не повезло. Опять же, помощь будет оценена по достоинству.


person meltrek    schedule 12.10.2012    source источник


Ответы (1)


Я решил эту проблему, взяв объявление @property для *startupPlayer и поместив его в файл AppDelegate.h вместо того, как это было показано ниже;

В AppDelegate.m

@interface AppDelegate () 

@property (nonatomic, strong) AVAudioPlayer *startupPlayer;
@end

Затем я все же @синтезировал его в файле .m, как показано ниже, и оставил прежним didFinishLaunchingWithOptions:

@implementation AppDelegate 
@synthesize startupPlayer = _startupPlayer;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

//------ PLAY SOUND CLIP WHILE LOADING APP -----

NSLog(@"PLAY SOUND CLIP WHILE LOADING APP");
NSURL *clip = [[NSBundle mainBundle] URLForResource: @"intro" withExtension:@"caf"];
self.startupPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:clip error:NULL];
[self.startupPlayer play]; }

Затем в моем MainViewController.m

#import "AppDelegate.h"

-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
//stop intro sound
AppDelegate *introClip = (AppDelegate *)[[UIApplication sharedApplication]delegate];
[[introClip startupPlayer]stop];}

Теперь, даже если вступительная музыка все еще воспроизводится в течение одного цикла, пользователь может переключиться на другой вид и остановить эту музыку.

person meltrek    schedule 18.10.2012
comment
как вы повторяете это после того, как звук закончил играть? @мельтрек - person Cyril; 02.03.2015
comment
_startupPlayer.numberOfLoops = -1;// отрицательное число означает, что играть можно бесконечно - person saintjab; 12.11.2016