首页 > 解决方案 > 来自先前选择器的选择器值 - CoreData/SwiftUI

问题描述

我有一个 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)
    }
}

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

标签: swiftcore-dataswiftuipicker

解决方案


下面的工作吗?

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


推荐阅读