2016-03-18 2 views
1

Я создал четыре ViewControllers в xcode, каждый из которых воспроизводит другой звуковой микс при нажатии кнопки воспроизведения. Если я перейду к другому диспетчеру просмотра и нажмите эту кнопку воспроизведения ... Как остановить воспроизведение всего другого звука и убедиться, что новый аудиомикс успешно воспроизводится?Как остановить воспроизведение звука с другого ViewController?

Тот же код, указанный ниже, присутствует в четырех мониторах ViewControllers. Единственное различие заключается в том, что я создал три новых экземпляра musicPlayer. Это musicPlayerSummer, musicPlayerWinter, musicPlayerAutumn. И я создал новые кнопки для каждого viewcontroller.

Любые предложения будут оценены.

Спасибо

импорт UIKit импорт AVFoundation

класс ViewControllerSpring: UIViewController {

var musicPlayer: AVAudioPlayer! 
var mySongs = ["1", "2", "3", "4"] 



override func viewDidLoad() { 
    super.viewDidLoad() 


    initAudio() 


    // Do any additional setup after loading the view. 

}

func initAudio() { 



    let path = NSBundle.mainBundle().pathForResource(mySongs[0], ofType: "mp3")! 

    do { 

     musicPlayer = try AVAudioPlayer(contentsOfURL: NSURL(string: path)!) 
     musicPlayer.prepareToPlay() 
     musicPlayer.numberOfLoops = -1 



    } catch let err as NSError { 
     print(err.debugDescription) 


    } 




    let session:AVAudioSession = AVAudioSession.sharedInstance() 

    do { 
     try session.setCategory(AVAudioSessionCategoryPlayback) 
    } catch { 
     //catching the error. 
    } 

}

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


/* 
// MARK: - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
// Get the new view controller using segue.destinationViewController. 
// Pass the selected object to the new view controller. 
} 
*/ 

override func prefersStatusBarHidden() -> Bool { 
    return true 
} 






@IBAction func springPlayPressed(sender: UIButton) { 

    if musicPlayer.playing { 

     musicPlayer.stop() 


     // for normal state 
     sender.setImage(UIImage(named: "play.png"), forState: UIControlState.Normal) 


    } else { 

     musicPlayer.play() 





     // for Highlighted state 
     sender.setImage(UIImage(named: "Pause.png"), forState: UIControlState.Normal) 
    } 
} 

}

+2

Есть несколько способов. Одним из способов является делегирование и другой способ PostNotification. Если есть только один игрок, то следует использовать делегирование, и если больше игроков останавливается, то следует использовать Notification Observer. – iMuzahid

+0

Согласовано, передовая практика идет выше. Но если вы хотите сделать короткий снимок ... (обычно считается плохой практикой) ... сделайте своих игроков глобальными, или лучше, чем они делают каждый из них. – MikeG

+0

Почему плохая практика делает игроков глобальными? – hoboman

ответ

0

Вы можете использовать уведомление.

Отправить уведомление, когда аудио отделка:

[[NSNotificationCenter defaultCenter] postNotificationName:@"MyAudioTerminatedNotification" object:self]; 

Получить его в другой Вид:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioTerminatedNotification:) name:@"MyAudioTerminatedNotification" object:nil]; 

ли вам действия:

- (void)audioTerminatedNotification:(NSNotification *)notification { 
    // Do you action 
} 

И избавиться от него:

[[NSNotificationCenter defaultCenter] removeObserver:self]; 
0

Чтобы решить эту проблему объявить аудиоплеера в AppDelegate

// inside AppDelegate 
var audioPlayer : AVAudioPlayer? = nil 

затем просто объявить в вашем ViewController:

var audioPlayer : AVAudioPlayer? { 
    get { 
     let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
     return appDelegate.audioPlayer 
    } 
    set { 
     let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
     appDelegate.audioPlayer = newValue 
    } 
} 
Смежные вопросы