来自先前选择器的选择器值 - CoreData/SwiftUI

Posted

技术标签:

【中文标题】来自先前选择器的选择器值 - CoreData/SwiftUI【英文标题】:Picker Values from a previous picker - CoreData/SwiftUI 【发布时间】:2021-01-13 20:40:05 【问题描述】:

我有一个 SwiftUI 表单,屏幕上有多个选择器。第一个是从存储在 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")
    

然后我希望在此下方有多个选择器,以便您从该特定团队中选择单个球员。我尝试了几种方法,但从未找到正确的解决方案,而且它们看起来都太啰嗦和老套了。我的尝试如下

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

有什么想法吗?我希望第二个选择器易于复制,因为我最终会非常需要它

【问题讨论】:

【参考方案1】:

以下是否可行?

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

因此,对于每个玩家索引,您创建一个带有该索引处玩家名称的 Text。

如果你需要它很多,你可以为它创建一个结构:

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 编写了,所以如果我在某个地方犯了错误,请见谅。但你无疑明白了。 :)

【讨论】:

以上是关于来自先前选择器的选择器值 - CoreData/SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 选择器值

使用 jQueryUI 获取日期选择器值

SwiftUI 从 CoreData 设置初始选择器值

如何将颤动的日期选择器值添加到文本字段?

在仅年份模式下更新引导日期选择器值

labview条件结构的分支选择器的问题