SwiftUI开发watchOS应用如何通过按钮触发听写输入功能
问题解答
功能实现方案说明
watchOS 7及以上版本可以完全通过纯SwiftUI实现点击按钮直接唤起听写的功能,不需要桥接UIKit,实现逻辑更简单,兼容性也更好:
- 你可以隐藏一个绑定了焦点状态的
TextField,点击按钮时把焦点状态设为激活,系统会自动唤起输入面板 - 如果要默认直接进入听写模式(跳过候选词、手写选项),watchOS 9及以上版本可以给
TextField添加.keyboardType(.dictation)修饰符
纯SwiftUI实现参考代码:
import SwiftUI struct ContentView: View { @State private var inputText = "" @FocusState private var isInputFocused: Bool var body: some View { VStack { // 隐藏TextField只用来触发输入 TextField("", text: $inputText) .focused($isInputFocused) .opacity(0) .frame(height: 0) Button(action: { isInputFocused = true }) { Image(systemName: "plus") .font(.largeTitle) } } } }
现有代码无响应的原因
你当前编写的桥接代码没有反应,核心原因是项目使用了SwiftUI原生的Watch App生命周期(即项目入口为带@main标记的App结构体,无独立WatchKit Extension目标),这种情况下WKExtension.shared().visibleInterfaceController会返回nil,后续的唤起逻辑自然不会执行。
如果要继续使用桥接方案,你需要将项目的生命周期切换为旧版WatchKit Extension模式,才能正常获取到当前的界面控制器实例。另外如果要默认直接进入听写,可以把allowedInputMode参数改为.dictation。
内容的提问来源于stack exchange,提问作者Tobias Fünke
相关产品推荐
相关产品推荐

