SwiftUI TextField调用onSubmit报错无该成员 如何实现回车触发操作
SwiftUI TextField使用.onSubmit报错解决方案
报错原因
onSubmit是SwiftUI 3.0推出的专属API,仅支持iOS 15.0+、macOS 12.0+、watchOS 8.0+及以上系统。如果你的项目最低部署版本低于该要求,编译器会直接抛出找不到onSubmit成员的错误。- 你当前为TextField指定了
.keyboardType(.numberPad)数字键盘,原生数字键盘没有自带的回车/提交按键,即便系统版本满足要求,也无法直接触发onSubmit回调。 - 你当前代码还存在变量名错误:回调中使用的
hymnNumber未定义,应该替换为你声明的绑定变量numNum,否则即便编译通过运行也会报错。
解决方案
方案1:兼容iOS13及以上低版本系统
如果你的项目需要适配iOS15以下版本,可以直接使用TextField自带的onCommit初始化参数实现提交逻辑,不需要依赖onSubmit修饰符:
struct Model: View { @EnvironmentObject var tappingSwitches: TapToggle @AppStorage("scrollToIndex") var scrollToIndex: Int? @State private var numNum: String = "" var body: some View { VStack(spacing: 0) { HStack { // 直接在初始化时添加onCommit回调 TextField("#", text: $numNum, onCommit: { withAnimation(.spring()) { // 修正变量名错误 if let songNum = Int(numNum) { scrollToIndex = songNum } // 可选:执行逻辑后收起键盘 UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) } }) .padding(.leading) .foregroundColor(.primary) .font(.title2) .frame(width: 70, height: 35) .background(Color("cTabColor")) .cornerRadius(20) .keyboardType(.numberPad) } .foregroundColor(Color("cTextColor")) .background(Color("cColor")) .clipShape(Capsule()) .padding(.horizontal) ViewModel() } } }
方案2:仅支持iOS15及以上系统
如果不需要兼容低版本,先修改项目最低部署配置:选中项目Target → General → Deployment Info → 将iOS版本设置为15.0或更高,同时给数字键盘添加自定义的提交按键:
struct Model: View { @EnvironmentObject var tappingSwitches: TapToggle @AppStorage("scrollToIndex") var scrollToIndex: Int? @State private var numNum: String = "" var body: some View { VStack(spacing: 0) { HStack { TextField("#", text: $numNum) .padding(.leading) .foregroundColor(.primary) .font(.title2) .frame(width: 70, height: 35) .background(Color("cTabColor")) .cornerRadius(20) .keyboardType(.numberPad) // 给数字键盘添加顶部工具条的完成按钮 .toolbar { ToolbarItemGroup(placement: .keyboard) { Spacer() Button("完成") { // 点击完成收起键盘,同时触发onSubmit回调 UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) } } } .onSubmit(of: .text) { withAnimation(.spring()) { // 修正变量名错误 if let songNum = Int(numNum) { scrollToIndex = songNum } } } } .foregroundColor(Color("cTextColor")) .background(Color("cColor")) .clipShape(Capsule()) .padding(.horizontal) ViewModel() } } }
内容的提问来源于stack exchange,提问作者Lian
相关产品推荐
相关产品推荐

