簡體   English   中英

來自先前選擇器的選擇器值 - CoreData/SwiftUI

[英]Picker Values from a previous picker - CoreData/SwiftUI

我有一個 SwiftUI 表格,屏幕上有多個選擇器。 第一個是 select 來自存儲在 Core Data 中的數據庫的團隊。 這些團隊中的每一個都與 Player 具有一對多的關系。 以下是實體:

播放器

在此處輸入圖像描述

團隊

在此處輸入圖像描述

在我的內容視圖中,我使用 fetch 請求從 Core Data 獲取所有團隊,然后我將對其進行迭代以完成我的選擇器。

@FetchRequest(sortDescriptors: [])
private var teams: FetchedResults<Team>

@State var teamSelected = 0

var body: some View {
    NavigationView{
        Form{
            Section(header: Text("Team Selection")){
                Picker(selection: $teamSelected, label: Text("Team Select")){
                    ForEach(0..<teams.count){ team in
                        Text("\(teams[team].name ?? "Unknown")")
                    }
                }
            }
        }
        .navigationBarTitle("Team Selection")
    }
}

然后,我希望在此下方有多個選擇器,允許您從該特定團隊中選擇 select 單個玩家。 我嘗試了幾種方法,但從未找到正確的解決方案,而且它們看起來都太啰嗦和老套了。 我的嘗試如下

Picker(selection: $number1, label: Text("#1")){
    ForEach(0..<teams[teamSelected].people!.count){player in
        Text(player.name)
    }
}

有任何想法嗎? 我希望第二個選擇器易於復制,因為我最終會非常需要它

下面的工作嗎?

Picker(selection: $selectedPlayerIndex, label: Text("#1")){
    ForEach(0..<teams[teamSelected].people!.count){playerIndex in
        Text(teams[teamSelected].people![playerIndex].name)
    }
}

因此,對於每個玩家索引,您創建一個帶有該索引處玩家名稱的文本。

如果你需要它很多,你可以為它創建一個結構:

struct PlayerPicker: View {
    var team: Team
    @Binding var selectedPlayerIndex: Int

    var body: some View {
        Picker(selection: $selectedPlayerIndex, label: Text("#1")){
            ForEach(0..<team.people!.count){playerIndex in
                Text(team.people![playerIndex].name)
            }
        }
    }
}

然后你可以像這樣使用它:

@FetchRequest(sortDescriptors: [])
private var teams: FetchedResults<Team>

@State var teamSelected = 0
@State var selectedPlayerIndex: Int

var body: some View {
    NavigationView{
        Form{
            Section(header: Text("Team Selection")){
                Picker(selection: $teamSelected, label: Text("Team Select")){
                    ForEach(0..<teams.count){ team in
                        Text("\(teams[team].name ?? "Unknown")")
                    }
                }

                PlayerPicker(team: teams[teamSelected], selectedPlayerIndex: $selectedPlayerIndex)
            }
        }
        .navigationBarTitle("Team Selection")
    }
}

這是一個非常干凈的解決方案; 恕我直言,一點也不hacky。
我無法真正測試這段代碼,也有一段時間沒有用 SwiftUI 編寫代碼,所以如果我在某個地方犯了錯誤,請原諒。 但你無疑明白了。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM