如何在SwiftUI中为自定义输入框触发iOS内置听写功能?
自定义SwiftUI输入框集成iOS听写功能的正确实现
核心解决思路
TextInputDictationActivation正是官方用来触发听写的工具,之前没反应大概率是没绑定好输入框焦点,或者激活逻辑不对。必须把它和输入框的焦点状态绑定,配合按钮点击来触发听写流程。
完整可运行代码
import SwiftUI struct CustomDictationInputView: View { @State private var inputContent = "" @FocusState private var isInputFocused: Bool @State private var triggerDictation = false var body: some View { HStack(spacing: 8) { // 自定义输入框 TextField("请输入内容", text: $inputContent) .focused($isInputFocused) // 绑定听写激活状态 .textInputDictationActivation(.constant(triggerDictation)) .onChange(of: triggerDictation) { isActive in if isActive { // 强制输入框获取焦点,否则听写结果无法写入 isInputFocused = true } } // 听写触发按钮 Button { triggerDictation = true } label: { Image(systemName: "mic.fill") .foregroundColor(.accentColor) } // 监听听写结束,重置激活状态 .onReceive(NotificationCenter.default.publisher(for: UITextInput.currentInputModeDidChangeNotification)) { _ in triggerDictation = false } } .padding(.horizontal, 12) .padding(.vertical, 8) .border(Color.gray.opacity(0.3), cornerRadius: 8) } } #Preview { CustomDictationInputView() }
关键注意点
- 焦点必须激活:如果输入框没获取焦点,听写启动后也无法把结果写入输入框,所以按钮点击时要强制让输入框聚焦。
- 权限配置不能忘:在
Info.plist里添加NSSpeechRecognitionUsageDescription键,填写比如“需要使用语音识别来将语音转换为文字”,否则会被系统拒绝授权,听写直接用不了。 - 状态重置:听写结束后要把
triggerDictation设回false,不然下次点击按钮可能没反应,这里用系统通知来监听听写结束事件。
排查要点
- 点击按钮没反应:检查输入框是否真的获取了焦点,可在按钮点击后打印
isInputFocused的值确认;另外确认设备所在地区支持听写功能,部分地区可能受限。 - 有听写界面但无结果:检查
Info.plist的权限描述是否正确,以及用户是否在系统设置里授予了语音识别权限。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

