在 SwiftUI 中为 TextField 设置初始值 - 比较新旧值 [英] Set initial value for a TextField in SwiftUI - compare new and old value
问题描述
我看过很多关于如何使用空 TextField 收集新值的示例和教程,但没有一个展示如何使用 TextField 来编辑值.
I have seen a lot of examples and tutorial of how to use an empty TextField for collecting new values, but none that shows how to use a TextField to edit a value.
在我的用例中,我希望 TextField 预先填充/预填充来自我的视图模型的数据,然后当用户编辑数据时,应启用保存按钮.在我的表单中,我还有一个导航链接,它通向一个子页面,用户可以在其中从列表中选择一些内容,然后返回到表单.
In my use-case, I want the TextField to be prepopulated/prefilled with data from my viewmodel, then as user edits the data, a Save button should be enabled. In my form, I also have a navigationlink that leads to a sub-page where the user can select something from a list, and then be routed back to the form.
只要我使用空字段,它就会像描述的那样运行;用户可以在字段中输入临时内容,导航到子页面,临时值仍然和他离开时一样.
It behaves as described as long I use an empty field; the user can type something temporary in the field, navigate to the sub page, and the temp value is still like it was when he left.
struct TextFieldDemo: View {
var model:String // Actual a more complex view model
@State var editedValue:String = ""
var body: some View {
VStack(alignment: .leading, spacing: 20) {
Group{
Text("Some label")
TextField("Placeholder text", text: $editedValue)
}
Divider()
Text("Some navigation link to push in a page where " +
"the user can select something from a list and click back...")
// If the user starts to edit the textfield - follows a navigation link and comes back
// he should be able to continue edit the field where he left of - the text field should
// not have been reset to the original value.
Button(action: {
// Call some save function in the ViewModel
},label: {
Text("SAVE")
}
).disabled(model == editedValue)
}.onAppear(){
// I could have done something like:
// self.editedValue = model
// but it seems like this will fire if the user navigates into the described page and reset
// the TextField to the model value.
}
}
}
struct TextFieldDemo_Previews: PreviewProvider {
static var previews: some View {
TextFieldDemo(model: "The old value")
}
}
推荐答案
要使用模型中的值初始化文本字段,您需要定义自己的初始化程序并使用 State(wrappedValue:)
@State
变量的初始值设定项:
To initialize the text field with the value from your model, you need to define your own initializer and use the State(wrappedValue:)
initializer for @State
vars:
struct TextFieldDemo: View {
var model:String // Actual a more complex view model
@State var editedValue: String
init(model: String) {
self.model = model
self._editedValue = State(wrappedValue: model) // _editedValue is State<String>
}
var body: some View {
VStack(alignment: .leading, spacing: 20) {
Group{
Text("Some label")
TextField("Placeholder text", text: $editedValue)
}
Divider()
Text("Some navigation link to push in a page where " +
"the user can select something from a list and click back...")
// If the user starts to edit the textfield - follows a navigation link and comes back
// he should be able to continue edit the field where he left of - the text field should
// not have been reset to the original value.
Button(action: {
// Call some save function in the ViewModel
},label: {
Text("SAVE")
}
).disabled(model == editedValue)
}.onAppear(){
// I could have done something like:
// self.editedValue = model
// but it seems like this will fire if the user navigates into the described page and reset
// the TextField to the model value.
}
}
}
struct TextFieldDemo_Previews: PreviewProvider {
static var previews: some View {
TextFieldDemo(model: "The old value")
}
}
这篇关于在 SwiftUI 中为 TextField 设置初始值 - 比较新旧值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!