如果我給你一個簡單的例子來說明我想要實作的目標,問這個問題會更容易,所以請多多包涵!
我有一個結構 - 比方說,用戶,一些簡單的東西。
struct User: Identifiable {
var id = UUID()
var userName: String
var userRegistrationDate: String
}
//example of a User instance:
User(userName: "Graham Bell", userRegistrationDate: "12.12.2022")
我創建了 3 個不同的 User 實體并將它們放入一個串列中。該串列可以通過新的用戶實體不斷擴展。
let userList: [User] = [User1, User2, User3]
//User1, User2, User3 are instances of User.
我想創建一個選擇器。
Picker 應該遍歷 User.userName,當我從下拉選單中單擊 UserName 時,我希望應用程式加載具有我從選擇器中選擇的特定用戶名的用戶及其屬性和方法。
更準確地說:
struct aListView: View {
@State var selectedUserName: String = ""
@State var selectedUser: User = User(...)
@State var userList: [User] = [User1, User2, User3]
var body: some View {
List {
Picker("User Name:", selection: $selectedUserName) {
ForEach(userList) { user in
Text(user.userName)
}
}
HStack {
Text("Registration Date:")
Spacer()
Text(selectedUser.registrationDate)
}
}
問題:
我從下拉選單中選擇一個用戶名。userName 是每個 User 實體的兩個屬性之一 - 基本上我按他們的名字選擇 User。
在我選擇了要加載的用戶的名稱后,我需要以某種方式檢索我選擇的用戶的registrationDate 屬性。
我想創建一個 @State selectedUser 變數,該變數根據與 Picker 系結的 @State selectedUserName 變數而變化。
我需要在這些@State 變數之間創建一個連接,這是一個回圈遍歷用戶串列的某種函式,找到在選擇器中選擇的名稱的用戶,將@State var selectedUser 更改為名稱為 I 的用戶采摘。只有在那之后,我才能檢索該用戶的注冊日期。
我應該如何進行?請記住,這是我正在使用的一個非常簡化的示例。我正在嘗試創建一個具有很多屬性和方法的復雜資料結構。所以我不認為我可以找到一個 if/else 解決方案。
請幫忙 :(
uj5u.com熱心網友回復:
嘗試這種方法,其中selectedUser
isPicker
型別User
,(請注意,如果需要,您可以將其設為 Optional 型別)。
使用這種方法,您可以直接訪問所選用戶的所有屬性,如示例代碼所示。
struct ContentView: View {
var body: some View {
MyListView()
}
}
struct User: Identifiable, Hashable { // <-- here
var id = UUID()
var userName: String
var userRegistrationDate: String
}
struct MyListView: View {
@State var selectedUser = User(userName: "", userRegistrationDate: "") // <-- here
// for testing
@State var userList = [User(userName: "Graham Bell", userRegistrationDate: "12.12.2022"),
User(userName: "xxxx", userRegistrationDate: "10.10.2010"),
User(userName: "yyyy", userRegistrationDate: "9.9.2009")]
var body: some View {
List {
Picker("User Name:", selection: $selectedUser) {
ForEach(userList) { user in
Text(user.userName).tag(user) // <-- here
}
}
HStack {
Text("Registration Date:")
Spacer()
Text(selectedUser.userRegistrationDate) // <-- here
}
}
.onAppear {
// setting the initial selection
if let usr = userList.first {
selectedUser = usr
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/526038.html
標籤:迅速迅捷swiftui 列表