2012-06-03 1 views
0

Я хочу остановить свою игру, если пользователь вернется к игре с проигрывателем музыкального проигрывателя iDevice.Управление AVAudioPlayer из приложения AppDelegateWillEnterForeground

Приложение AppDelegate.mWillEnterForeground успешно проверяет музыкальный проигрыватель, , но я не знаю, как сказать моему AVAudioPlayer, чтобы остановить, отсюда.

Было бы очень благодарно, если кто-нибудь скажет мне, как это сделать? Это дает мне массивную головную боль!

AppDelegate.m:

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    UInt32 propertySize, audioIsAlreadyPlaying=0; 
    propertySize = sizeof(UInt32); 
    AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying, &propertySize, &audioIsAlreadyPlaying); 

    if(audioIsAlreadyPlaying){¨ 
     NSLog(@"iDevice Music is playing!"); 
     [myAudioPlayer stop];//<<< *** the problemo bit *** :(
    } 
} 

Page1ViewController.m код, в случае, если это помогает:

- (void)viewDidLoad 
{ 
    NSError *myAudioSessionError = nil; 
    myAudioSession = [AVAudioSession sharedInstance]; 
    if ([myAudioSession setCategory:AVAudioSessionCategoryAmbient error:&myAudioSessionError]){ 
     NSLog(@"AVAudioSession created."); 
    }else { 
     NSLog(@"AVAudioSession not created."); 
    } 

    … 
    (if/else statements call the createAudioPlayer method.) 
} 

-(void)createAudioPlayer{ 
    dispatch_queue_t dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_async(dispatchQueue, ^(void){ 
     NSBundle *mainBundle = [NSBundle mainBundle]; 
     NSString *musicFilePath = [mainBundle pathForResource:@"main_music" ofType:@"aiff"]; 
     NSData *musicFileData = [NSData dataWithContentsOfFile:musicFilePath]; 
     NSError *myAudioPlayerError = nil; 
     //Start the audio player 
     self.myAudioPlayer = [[AVAudioPlayer alloc] initWithData:musicFileData error:&myAudioPlayerError]; 
     if (self.myAudioPlayer != nil){//Check AVAudioPlayer successfully initiated 
      self.myAudioPlayer = self; 
      self.myAudioPlayer = -1;//loop continuously 
      if ([self.myAudioPlayer prepareToPlay]){ 
       //(successfully created AudioPlayer) 
      }else { 
       //(failed to play) 
      } 
     }else { 
      //(failed to initiate an AudioPlayer) 
     } 
    }); 
} 

ответ

0

Во-первых, myAudioPlayer является свойством Page1ViewController, но в вашем AppDelegate вы ссылаетесь на него так, как если бы он был объявлен делегатом.

вы должны получить ссылку на аудиопроигрыватель Page1ViewControllers для остановки.

Если вы не ошиблись в своем коде, вероятно, вы должны сделать что-то подобное.

- (void)applicationWillEnterForeground:(UIApplication *)application { 

...... 

[self.page1ViewController.myAudioPlayer stop]; 

...... 



} 
+0

Да, это правильно, но я не знаю, как это сделать! Это мой вопрос. Я просто набрал [myAudioPlayer stop]; чтобы проиллюстрировать мою проблему. Как мне это сделать? –

+0

Так же, как вы объявили myAudioPlayer как свойство в Page1ViewController, создайте свойство для вашего AppDelegate, ссылающегося на страницу1ViewController. Поэтому в AppDelegate вы можете сделать self.page1ViewController. – skram

+0

Я только что попробовал ваш код выше и получил эту ошибку предупреждения: Property 'Page1ViewController' не найден на объекте типа 'AppDelegate *' Это в основном то, что я пытаюсь сделать, хотя это синтаксис, который я изучаю. : | –

0

В качестве альтернативы, если вы не хотите, чтобы создать свойство Page1ViewController, вы можете создать метод в Page1ViewController, который возвращает myAudioPlayer для использования в другом классе, как в AppDelegate. Пример ниже ..

//Page1ViewController.h 
@interface Page1ViewController : UIViewController... 
.... 
-(AVAduioPlayer*)currentPlayer; 
@end 

//Page1ViewController.m 
-(AVAudioPlayer*)currentPlayer { 
    return self.myAudioPlayer; 
} 


//AppDelegate.m 

- (void)applicationWillEnterForeground:(UIApplication *)application { 

    [[page1ViewController currentPlayer] stop]; 
} 
+0

Большое спасибо, я думаю, ваши решения будут работать. Одна из проблем, которую я только что заметил, заключается в том, что AppDelegate не был включен в ViewController или наоборот. Что ДОЛЖНО быть сделано ??? ViewController.h в AppDelegate.h или AppDelegate.h в ViewController.h? :) Спасибо за ваше терпение и помощь! –

+0

Я думал, что AppDelegate все равно подключен ко всему приложению. Это сбивает с толку. : | –

+0

Это зависит от того, как Page1ViewController подключен к AppDelegate, мои приведенные выше примеры предполагают, что ваш Page1ViewController инициализирован из AppDelegate. – skram

Смежные вопросы