2017-11-16 10 views
0

Main.StoryboardでカスタムLaunchScreenを作成して、サウンドが実際にLaunchScreenから来ているように見せます。サウンドはうまく機能し、次のビューコントローラーへのセグも同様に機能します。唯一の問題は、音の再生が停止する前にセグが発生することです。私は、セグを作る前に音が完了したいと思います。論理的には、performSegueは.play()の直後にあるため、動作するはずです。しかし、それは同時に起こると思われる。ここに私のコードです:サウンドの再生が停止した後にどのようにセグを実行するのですか?

"showNavController" は単にセグエある
perform(Selector(("showNavController")), with: self, afterDelay: 3) 

func showNavController() { 
    performSegue(withIdentifier: "myLaunchSegue", sender: nil) 
} 

が、エラーでプログラムがクラッシュ「キャッチされない例外を

super.viewDidLoad() 

    //PLAY SOUND CLIP// 
    let musicFile = Bundle.main.path(forResource: "fanfare", ofType: ".mp3") 
    do { 
     try musicSound = AVAudioPlayer(contentsOf: URL (fileURLWithPath: musicFile!)) 
    } catch { print("ERROR PLAYING MUSIC")} 

      musicSound.play() //WORKS 
    // 


    DispatchQueue.main.async() { 
     self.performSegue(withIdentifier: "myLaunchSegue", sender: self) //WORKS 
    } 

私が追加しようとしています.... ....インスタンスに送信された認識できないセレクタ "

私はまた、prを保持するためにブール値を追加しようとしました音が演奏されるまで進行中であるが、動作させることはなかった。何か案は?

///////////////////////////// 更新: ラッセルズにお答えしますが、いくつか質問があります。デリゲートとしてAVAudioPlayerを設定し、その平均値は次のように次のクラスにそれを設定します:

class MyLaunchViewController: UIViewController, AVAudioPlayer { ... 

また、どのように私は、関数audioPlayerDidFinishPlayingを呼ぶのですか?同様に:

audioPlayerDidFinishPlaying(musicSound, successfully: true) 

私はコードブロック全体を投稿します。 UIViewController、AVAudioPlayer { するvar musicSound::SOUND

FOR AVAudioPlayer = AVAudioPlayer()//
override func viewDidLoad() { 
    super.viewDidLoad() 

    //PLAY SOUND CLIP// 
    let musicFile = Bundle.main.path(forResource: "fanfare", ofType: ".mp3") 
    do { 
     try musicSound = AVAudioPlayer(contentsOf: URL (fileURLWithPath: musicFile!)) 
    } catch { print("ERROR PLAYING MUSIC")} 

      musicSound.play() //WORKS 
    // 
    audioPlayerDidFinishPlaying(musicSound, successfully: true) 
} 

optional func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { 
    DispatchQueue.main.async() { 
     self.performSegue(withIdentifier: "myLaunchSegue", sender: self) 
    } 
} 
...

import UIKit 

輸入AVFoundation // SOUND FOR

クラスMyLaunchViewControllerそれが簡単に理解することができます

クラスにAVAudioPlayerを書き込むときにエラーが発生します(おそらく、私は何をするべきか誤解しましたか?)。私は複数の継承を持っていると言います。また、私はオプションとして新しい関数を設定することを望んでいません。プロトコルメンバーのためだけです。私は、エラーを訂正し、プログラムを実行すると、サウンドの再生が終了する前に最後に、次のセグエが実行されます... :(悲しいパンダ。

あなたのLaunchScreen AVAudioPlayerDelegateを行い、その後、 audioPlayerDidFinishPlayingコールバックを使用する必要が

答えて

1
+0

の詳細を取得することができ、第1のコントローラでは、あなたが必要とするすべて

import UIKit import AVFoundation class ViewController: UIViewController, AVAudioPlayerDelegate { var musicSound: AVAudioPlayer? override func viewDidLoad() { super.viewDidLoad() //PLAY SOUND CLIP// let musicFile = Bundle.main.path(forResource: "sound", ofType: ".wav") do { try musicSound = AVAudioPlayer(contentsOf: URL (fileURLWithPath: musicFile!)) } catch { print("ERROR PLAYING MUSIC")} musicSound?.delegate = self musicSound!.play() //WORKS print("Next line after play") } func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { DispatchQueue.main.async() { print("audioPlayerDidFinishPlaying") self.performSegue(withIdentifier: "myLaunchSegue", sender: self) } } } 

あなたの答えをありがとう!しかしそれを正しく実装する方法まだ分からない。いくつかの質問を持っているのです。私のオリジナルの下部を参照してください。投稿: –

+0

Joamkim-ハードコード化された時間遅延を避ける必要があります。彼らはせいぜい推測であり、少しばかげている。私はあなたに作業バージョンを示すことができます - しかし、その日の終わりまでではないので、他の誰かが私にそれを打つかもしれません! – Russell

+0

Joakim - 私はあなたに実例を与えるために上記の私の答えを更新しました – Russell

関連する問題