前提・実現したいこと
1つのシングルトンに複数のAVSpeechSynthesizerDelegateの処理を割り当てたい。
###ここに質問の内容を詳しく書いてください。
AVSpeechSynthesizerを用いて、読み上げアプリを作っています。再生ボタンが配置されている画面が複数あり、didFinishのタイミングで、画面ごとに異なる処理をさせたいです。再生機能は、シングルトンで実装していますが、画面ごとにdelegateの処理を分ける必要があります。どのように実装できるか調べています。
発生している問題
以下の該当のソースコードだと、当たり前ですが画面ごとに処理を分けることができません。また、
再生ボタンがある画面でそれぞれ
swift
1SpeechManager.synthesizer.delegate = self
を書いて、それぞれの画面ごとに処理を書くと、、複数の箇所の関数が一度に実行されてしまい困っています。
該当のソースコード
swift
1class SpeechManager: NSObject, AVSpeechSynthesizerDelegate { 2 3 static let sharedInstance = SpeechManager() 4 5 let synthesizer = AVSpeechSynthesizer() 6 7 override init() { 8 super.init() 9 // delegateの設定 10 synthesizer.delegate = self 11 } 12 13 // 音声再生開始 14 func startSpeech(speechText: String) { 15 synthesizer.speak(setSpeechText(text: speechText)) 16 } 17 18 // 音声再生停止 19 func stopSpeech() { 20 synthesizer.stopSpeaking(at: AVSpeechBoundary.immediate) 21 } 22 23 // 音声設定 24 private func setSpeechText(text: String) -> AVSpeechUtterance { 25 // AVSpeechUtteranceを作成 26 let utterance = AVSpeechUtterance(string: text) 27 // 言語を設定 28 utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP") 29 // 再生速度を設定 30 utterance.rate = AVSpeechUtteranceDefaultSpeechRate 31 // 声の高さを設定 32 utterance.pitchMultiplier = 1.0 33 34 return utterance 35 } 36 37 38 // 読み上げが終了したとき 39 func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) { 40 print("didFinish") 41// 画面ごとにここの処理を変えたい。 42 } 43 44 45 46} 47
試したこと
シングルトンを使わないで、別々の画面で再生機能を実装していた。この場合はdelegateの処理を分けることができるがこれだと、画面遷移すると再生が重なってしまうときがあり、シングルトンを使うことにした。だが、今度はDelegateの処理がうまくいかず悩んでいる。
補足情報(FW/ツールのバージョンなど)
Swift
もっと別のコードが見たい場合はおっしゃってください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。