質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1403閲覧

シングルトンと複数のdelegateについて(swift)

minminmikan

総合スコア0

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/05/26 11:11

前提・実現したいこと

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
もっと別のコードが見たい場合はおっしゃってください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。NotificationCenterとDelegateを組み合わせることで実装できました。

投稿2021/05/26 14:01

minminmikan

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問