答案 0 :(得分:5)
UITextField符合UITextInput Protocol (在“使用听写”部分下是感兴趣的方法)。 在此协议中,您可以覆盖 dictationRecordingDidEnd 方法。
一种方法是继承 UITextField 并实施上述方法以及 UITextInput 协议中感兴趣的任何其他方法。
示例子类 .h
styles/admin
<强>的.m 强>
#import <UIKit/UIKit.h>
@interface BWDictationTextField : UITextField
@end
不幸的是,没有记录的方法来检测麦克风按钮的实际敲击(听写确实开始)。
答案 1 :(得分:0)
当文本输入更改(包括听写开始和停止时)时,文本字段将报告更改。我们可以听取此通知并在听写开始和停止时进行报告。
这里是使用此技术的 Swift 子类。
protocol DictationAwareTextFieldDelegate: class {
func dictationDidEnd(_ textField: DictationAwareTextField)
func dictationDidFail(_ textField: DictationAwareTextField)
func dictationDidStart(_ textField: DictationAwareTextField)
}
class DictationAwareTextField: UITextField {
public weak var dictationDelegate: DictationAwareTextFieldDelegate?
private var lastInputMode: String?
private(set) var isDictationRunning: Bool = false
override func dictationRecordingDidEnd() {
isDictationRunning = false
dictationDelegate?.dictationDidEnd(self)
}
override func dictationRecognitionFailed() {
isDictationRunning = false
dictationDelegate?.dictationDidEnd(self)
}
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
private func commonInit() {
NotificationCenter.default.addObserver(self, selector: #selector(textInputCurrentInputModeDidChange), name: .UITextInputCurrentInputModeDidChange, object: nil)
}
deinit {
NotificationCenter.default.removeObserver(self)
}
@objc func textInputCurrentInputModeDidChange(notification: Notification) {
guard let inputMode = textInputMode?.primaryLanguage else {
return
}
if inputMode == "dictation" && lastInputMode != inputMode {
isDictationRunning = true
dictationDelegate?.dictationDidStart(self)
}
lastInputMode = inputMode
}
}
当此类侦听通知时,如果有许多DictationAwareTextFields,则该通知将被多次调用。如果这是一个问题,则必须将通知观察代码从textField中移到更高的类中,例如视图控制器。