问:Form 和 TextField 上的错误 [SwiftUI]
Q: Bug on Form and TextField [SwiftUI]
当我在 Form
中使用 TextField
时,只有点击该字段才能显示正确的值。
名称字段最初显示 dummy
并在点击时更改为 shuji
。
如果我将 Form
更改为 VStack
,则会显示初始值。
ContentView.swift
import SwiftUI
struct User {
var name: String
var email: String
}
struct ContentView: View {
@Binding var user: User
@State private var name: String = "dummy"
@State private var email: String = ""
var body: some View {
NavigationView {
Form {
TextField("Name", text: $name)
TextField("Email", text: $email)
}
.navigationTitle("Edit user")
.toolbar {
Button("Save") {
user.name = name
user.email = email
}
}
}
.onAppear {
name = user.name
email = user.email
}
}
}
FormTestApp.swift
import SwiftUI
@main
struct FormTestApp: App {
@State var user = User(name: "shuji", email: "shuji@abc.com")
var body: some Scene {
WindowGroup {
ContentView(user: $user)
}
}
}
在 iPhone 12 iOS 15.1 和模拟器 iOS 15.0
上测试
要“让它工作”,请将 .onAppear {...}
移动到 TextField
之后,如下所示:
struct ContentView: View {
@Binding var user: User
@State private var name: String = "dummy"
@State private var email: String = ""
var body: some View {
NavigationView {
Form {
TextField("Name", text: $name)
TextField("Email", text: $email)
.onAppear { // <--- here
name = user.name
email = user.email
}
}
.navigationTitle("Edit user")
.toolbar {
Button("Save") {
user.name = name
user.email = email
}
}
}.navigationViewStyle(.stack)
}
}
当我在 Form
中使用 TextField
时,只有点击该字段才能显示正确的值。
名称字段最初显示 dummy
并在点击时更改为 shuji
。
如果我将 Form
更改为 VStack
,则会显示初始值。
ContentView.swift
import SwiftUI
struct User {
var name: String
var email: String
}
struct ContentView: View {
@Binding var user: User
@State private var name: String = "dummy"
@State private var email: String = ""
var body: some View {
NavigationView {
Form {
TextField("Name", text: $name)
TextField("Email", text: $email)
}
.navigationTitle("Edit user")
.toolbar {
Button("Save") {
user.name = name
user.email = email
}
}
}
.onAppear {
name = user.name
email = user.email
}
}
}
FormTestApp.swift
import SwiftUI
@main
struct FormTestApp: App {
@State var user = User(name: "shuji", email: "shuji@abc.com")
var body: some Scene {
WindowGroup {
ContentView(user: $user)
}
}
}
在 iPhone 12 iOS 15.1 和模拟器 iOS 15.0
上测试要“让它工作”,请将 .onAppear {...}
移动到 TextField
之后,如下所示:
struct ContentView: View {
@Binding var user: User
@State private var name: String = "dummy"
@State private var email: String = ""
var body: some View {
NavigationView {
Form {
TextField("Name", text: $name)
TextField("Email", text: $email)
.onAppear { // <--- here
name = user.name
email = user.email
}
}
.navigationTitle("Edit user")
.toolbar {
Button("Save") {
user.name = name
user.email = email
}
}
}.navigationViewStyle(.stack)
}
}