我编写了一个示例应用程序(适用于 macOS),其中包含 3 个用户。我对 NavigationSplitView 中的每个用户使用 NavigationLink。单击任何用户的导航链接时,详细视图应在编辑模式下显示用户名和年龄。它有效,但仅当第一个用户被单击时。如果我单击任何用户,则详细信息视图不会更改:它显示第一个用户数据。
我是 SwiftUI 的新手,我确信我误解了一些东西,但除了 SwiftUI 之外,我有 20 多年的编程经验。谢谢你的帮助。
我用谷歌搜索了几天,得到了很多好主意(尤其是来自 stackoverflow),但我无法解决我的问题。希望有人能解释我做错了什么。
// Create users array
class Users: ObservableObject {
@Published var users: [UserItem] = [
UserItem(id: 0, nickName: "Nick1", familyName: "Family1", firstName: "First1", age: 42),
UserItem(id: 1, nickName: "Nick2", familyName: "Family2", firstName: "First2", age: 39),
UserItem(id: 2, nickName: "Nick3", familyName: "Family3", firstName: "First3", age: 35)
]
}
// Define user properties
class UserItem: Identifiable, ObservableObject {
@Published var id:Int
@Published var nickName:String
@Published var familyName:String
@Published var firstName:String
@Published var age:Int
init(id:Int, nickName:String, familyName:String, firstName:String, age:Int) {
self.id = id
self.age = age
self.familyName = familyName
self.firstName = firstName
self.nickName = nickName
}
func fullName() -> String {
return "\(self.familyName) \(self.firstName) (\(self.nickName)) \(self.age)"
}
}
// Show users and their detail
struct Test2: View {
@StateObject var usersData = Users()
var body: some View {
NavigationSplitView {
List {
ForEach(usersData.users) { user in
NavigationLink {
UserDetailsView(user: user)
} label:{
Text(user.fullName())
}
}
Spacer()
}
} detail: {
Text("Select a user to edit.")
}
.padding()
.navigationTitle("Users")
}
}
// Show user detail
struct UserDetailsView: View {
@StateObject var user: UserItem
var body: some View {
VStack {
TextField("Family name", text: $user.familyName)
TextField("First name", text: $user.firstName)
TextField("Nick name", text: $user.nickName)
Stepper("Age: \(user.age)", value: $user.age)
Spacer()
// Check user property (live update))
Text(user.fullName())
}.padding()
}
}
#Preview {
Test2()
}