2016-04-05 21 views
1

Wenn ich meine App starte, beginnt eine Hintergrundmusik zu spielen. Aber wenn ich Start drücke und das Spiel spiele (in einem anderen Viewcontroller) und dann zurück zum Menü (der erste View-Controller), startet der Song erneut, aber während derselbe Song noch spielt (Ergebnis = zweimal gleichzeitig hören). Sehr nervig. Das ist meine viewDidLoad-Funktion (wahrscheinlich wo mein Problem ist). Kann mir jemand helfen (indem ich den Code erkläre oder vergebe), die Musik nur beim ersten Laden der Ansicht abzuspielen?Meine Hintergrundmusik wird zweimal (gleichzeitig) abgespielt

override func viewDidLoad() { 
    super.viewDidLoad() 

    // get path of audio file 
    let myFilePathString = NSBundle.mainBundle().pathForResource("Background Music Loop (Free to Use)", ofType: "mp3") 
    if let myFilePathString = myFilePathString { 

     let myFilePathURL = NSURL(fileURLWithPath: myFilePathString) 
     do { try myAudioPlayer = AVAudioPlayer(contentsOfURL: myFilePathURL) 
      myAudioPlayer.play() 
      myAudioPlayer.numberOfLoops = -1 
     }catch{ 
      print("error") 
     } 
    } 
} 
+0

Wenn Sie sagen, dass Sie "zurück zum Menü" gehen, kehren Sie tatsächlich zum ursprünglichen Menü zurück oder erstellen Sie ein neues Menü und gehen Sie zu diesem Menü? – dan

+0

Ich gehe zurück zum ursprünglichen Menü (der View-Controller, der beim Laden die Musik startet) –

Antwort

0

myAudioPlayer.play wird einfach wieder aufgerufen werden, da die VC wieder die viewDidLoad() Methode ausgeführt wird.

Meine Idee:

deklariert eine Variable

var x = false 

nächsten Schritt - eine Bedingung auf Ihrem Audio-Player machen zu spielen.

if x == false { // your code here } 

wenn die Segue von den anderen VC auslösenden versuchen, die prepareForSegue Methode zu verwenden.

So auf 2. Viewcontroller

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
{ 
    if segue.identifier == "yourIdentifier" { 
     let destinationController = segue.destinationViewController as! // Controller Name here 
     destinationController.x = true 
    } 
} 

Dies wird die x auf true gesetzt und die Musik wieder nicht läuft.

+0

danke !! aber nur eine kleine Frage, denn ich bin immer noch noob (begann erst mit der Programmierung) Ihr letzter Kommentar ist // Controller Name. Der Name von welchem ​​Controller der erste oder der zweite? Und für den Sequence Identifier ist es möglich, dass ich ihm einen Namen geben muss oder sollte es schon einen Namen geben –

+0

OOH IT WORKED DANKE SO VIEL !! Wirst du auch meine zukünftigen Fragen beantworten? –

+0

froh zu hören :) wenn Sie noch Hilfe mit dem View-Controller-Namen brauchen: Sie machen einen Übergang vom 2. zum ersten. Also ist das Ziel das erste VC. Indem Sie auf den Abschnitt in main.Storyboard klicken, können Sie den Identifikator in der rechten Spalte bearbeiten. füge den Namen dort hinzu und setze den gleichen Namen in "yourIdentifier". ich hoffe es hilft! – JVS

0

Es hängt alles von der gewünschten Funktionalität ab.

Wenn Sie nur die Hintergrundmusik zu spielen, wenn das Menü View-Controller auf dem Bildschirm ist, dass Sie die Dateinamen und Spieler Variablen Eigenschaften auf dem View-Controller und dann in viewWillAppear tun

Player.play 

Und dann machen könnten, wenn Wenn ein Benutzer von der Seite weg navigiert, wird die Wiedergabe in der Funktion viewDidDissappear angehalten.

Wenn Sie möchten, dass die Musik immer im Hintergrund abgespielt wird, lohnt es sich, eine eigene Klasse zu erstellen und sharedInstance für den Anwendungsdelegaten bereitzustellen, damit Sie eine einzelne Instanz des Players in der gesamten Anwendung verwalten können.