问: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)
    }
}