Ios 从TextField字符串到model';s已发布,可选整数属性

Ios 从TextField字符串到model';s已发布,可选整数属性,ios,swift,uitextfield,swiftui,textfield,Ios,Swift,Uitextfield,Swiftui,Textfield,我是Swift和SwiftUI新手,有一个带有@Published intValue可选项的模型和一个带有TextField的视图,其中它的text/string属性是双向绑定到模型的intValue的。需要确保将字符串形式的有效文本条目转换为模型的有效整数。建议在SwiftUI中采用什么方法来处理此问题?代码如下所示 //Model class AppModel:ObservedObject { @Published var intValue: Int? = 5 } //View @Ob

我是Swift和SwiftUI新手,有一个带有@Published intValue可选项的模型和一个带有TextField的视图,其中它的text/string属性是双向绑定到模型的intValue的。需要确保将字符串形式的有效文本条目转换为模型的有效整数。建议在SwiftUI中采用什么方法来处理此问题?代码如下所示

//Model
class AppModel:ObservedObject {
 @Published
 var intValue: Int? = 5
}

//View
@ObservedObject
 var appModel = AppModel.shared

TextField("", text: $appModel.intValue)
                    .keyboardType(.numberPad)
更新的示例代码

///////////
import SwiftUI

class Model: ObservableObject {
    static var shared: Model = Model()

    @Published
    var number: Int = 0

    init(){}

}

struct ContentView: View {
    var body: some View {
        TextFieldFormatter()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}


struct TextFieldFormatter: View {
    @ObservedObject
    var model: Model = Model.shared

    @State private var number: Int = 0


    let formatter: NumberFormatter = {
        let numFormatter = NumberFormatter()
        numFormatter.numberStyle = .none
        return numFormatter
    }()

    var body: some View {
        VStack {
            Text("State").onTapGesture {
                self.endEditing()
            }
            TextField("int", value: $number, formatter: formatter).keyboardType(.numberPad)
            Text("Echo: \(number)")
            Text("Observable")
            TextField("int", value: $model.number, formatter: formatter).keyboardType(.numberPad)
            Text("Echo: \(model.number)")
        }
    }
}

struct TextFieldFormatter_Previews: PreviewProvider {
    static var previews: some View {
        TextFieldFormatter()
    }
}

extension View {
    func endEditing() {
        UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to:nil, from:nil, for:nil)
    }
}

SwiftUI的TextField有几个构造函数。其中一个接受格式化程序参数

同样,如果你想用OntApple手势禁用屏幕,你可以考虑。 添加:

   @State var disabled: Bool = false
和改变:

       Form {
            Text("Disable").onTapGesture {
                //self.endEditing()
                self.disabled = true
            }
            TextField("int", value: $model.number, formatter: formatter).keyboardType(.numberPad)
            Text("Echo: \(model.number)")
            Text("Observable")
            TextField("int", value: $model.number, formatter: formatter).keyboardType(.numberPad)
            Text("Echo: \(model.number)")
        }.disabled($disabled.wrappedValue)

在用户键入时提供反馈有几种不同的方式,但在
UIViewRepresentable
类中的自定义
UITextView
似乎是最常见的。

您可以创建自定义
绑定
以传递到
文本字段

这是如何构造
绑定
文本字段
需要的内容):

var string=“”
让myBinding=Binding(get:{string}){
字符串=$0
}
绑定
构造函数的第一个参数是getter。此闭包应返回所需类型的值

第二个参数是setter。它是一个接受新值的闭包,并用它做一些事情(通常设置另一个值)

因此,如果您想创建一个
绑定
以传递到获取/设置
appModel.intValue
文本字段
,您可以创建一个
绑定
,并将其传递到
文本字段
,如下所示:

TextField(“),text:.init(
获取:{self.appModel.intValue.map(String.init)??“”},
集合:{self.appModel.intValue=Int($0)}
))
.键盘类型(.numberPad)

我用您的代码更新了示例代码,并添加到@Observable object中。对textfield进行更改时,使用state的绑定变量和使用observedobject的模型仍然显示为未更新。我做了一个小更改。删除状态变量并引用model.number在按Return键后所有操作都有效,但例如,新的
文本编辑器
仅提供
绑定
构造函数。这使事情变得麻烦。获取了一个错误,无法在映射函数上推断通用参数T。进行了一些更改,并提出了一些编译和更新的内容,但是编辑文本字段是有问题的。可以追加数字,但不能退格删除数字。这是我使用的代码。TextField(“int”,text:myBinding)让myBinding=Binding(get:{String(self.appModel.intValue)},set:{self.appModel.intValue=(int($0)??5)})您不希望appModel.intValue是可选的吗?
       Form {
            Text("Disable").onTapGesture {
                //self.endEditing()
                self.disabled = true
            }
            TextField("int", value: $model.number, formatter: formatter).keyboardType(.numberPad)
            Text("Echo: \(model.number)")
            Text("Observable")
            TextField("int", value: $model.number, formatter: formatter).keyboardType(.numberPad)
            Text("Echo: \(model.number)")
        }.disabled($disabled.wrappedValue)