A does not conform to protocol NSObjectProtocol 表示你的类必须继承自 NSObject,你可以阅读更多关于它的信息here。
现在我不知道您是如何构建代码的,但这个小示例似乎对我有用。首先是一个包含AVSpeechSynthesizer 的简单类:
class Speaker: NSObject {
let synth = AVSpeechSynthesizer()
override init() {
super.init()
synth.delegate = self
}
func speak(_ string: String) {
let utterance = AVSpeechUtterance(string: string)
synth.speakUtterance(utterance)
}
}
请注意,我在此处设置了委托(在 init 方法中),并注意它必须从 NSObject 继承才能使编译器满意(非常重要!)
然后是实际的委托方法:
extension Speaker: AVSpeechSynthesizerDelegate {
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {
print("all done")
}
}
最后,我可以在这里使用该类,如下所示:
class ViewController: UIViewController {
let speaker = Speaker()
@IBAction func buttonTapped(sender: UIButton) {
speaker.speak("Hello world")
}
}
这奖励了我
全部完成
AVSpeechSynthesizer 停止讲话时在我的控制台中。
希望对你有所帮助。
更新
所以,时间过去了,@case-silva 下面的 cmets 询问是否有实际示例,@dima-gershman 建议直接在ViewController 中使用AVSpeectSynthesizer。
为了适应这两种情况,我在这里用UITextField 和UIButton 做了一个简单的ViewController 示例。
流程是:
- 您在文本字段中输入了一些文本(如果没有,将设置默认值)
- 你按下按钮
- 按钮被禁用并且背景颜色发生了变化(抱歉,这是我能想到的最好的方法:))
- 语音完成后,按钮启用,文本字段被清除,背景颜色再次更改。
这是它的外观
一个简单的UIViewController 示例
import UIKit
import AVFoundation
class ViewController: UIViewController {
//MARK: Outlets
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var speakButton: UIButton!
let synth = AVSpeechSynthesizer()
override func viewDidLoad() {
super.viewDidLoad()
synth.delegate = self
}
@IBAction func speakButtonTapped(_ sender: UIButton) {
//We're ready to start speaking, disable UI while we're speaking
view.backgroundColor = .darkGray
speakButton.isEnabled = false
let inputText = textField.text ?? ""
let textToSpeak = inputText.isEmpty ? "Please enter some text" : inputText
let speakUtterance = AVSpeechUtterance(string: textToSpeak)
synth.speak(speakUtterance)
}
}
extension ViewController: AVSpeechSynthesizerDelegate {
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {
//Speaking is done, enable speech UI for next round
speakButton.isEnabled = true
view.backgroundColor = .lightGray
textField.text = ""
}
}
希望能给你一个线索案例。