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

SwiftUI TextField数字输入实时更新及字符串转Int求和问题

解决方案

问题根源

SwiftUI 中使用带value+formatter参数的TextField,默认只会在编辑结束(失去焦点/按下回车)时同步绑定值,搭配没有回车按键的数字键盘时触发更新更困难。

实现方案

将绑定变量改为String类型实现实时同步,手动做String到Int的安全转换即可:

struct ContentView: View {
    // 改为String类型绑定,实现输入实时更新
    @State private var numOneText: String = "0"
    @State private var numTwoText: String = "0"

    var body: some View {
        NavigationView {
            VStack {
                Form {
                    Section {
                        // 绑定text参数而非value
                        TextField("Number One", text: $numOneText)
                            .keyboardType(.numberPad)

                        TextField("Number Two", text: $numTwoText)
                            .keyboardType(.numberPad)
                    }

                    NavigationLink {
                        // 转换为合法Int后传值,转换失败默认返回0
                        AddedView(numOne: Int(numOneText) ?? 0, numTwo: Int(numTwoText) ?? 0)
                    } label: {
                        Text("Navigate")
                    }
                }
            }
        }
    }
}

struct AddedView: View {
    let numOne: Int
    let numTwo: Int
    // 实时计算求和结果
    private var added: Int {
        numOne + numTwo
    }

    var body: some View {
        VStack(spacing: 20) {
            Text("第一个数字:\(numOne)")
            Text("第二个数字:\(numTwo)")
            Text("求和结果:\(added)")
                .fontWeight(.bold)
        }
    }
}

补充优化

如果需要过滤输入中的非数字字符,避免用户粘贴非法内容,可以给TextField加输入过滤逻辑:

TextField("Number One", text: $numOneText)
    .keyboardType(.numberPad)
    .onChange(of: numOneText) { newValue in
        // 只保留数字字符
        numOneText = newValue.filter { $0.isNumber }
    }

内容的提问来源于stack exchange,提问作者Calvin Wood

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:15:03