You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:45:04