我有一个在屏幕上有多个选择器的SwiftUI表单。第一个步骤是从存储在Core Data中的数据库中选择一个团队。这些球队中的每一个都与玩家有一对多的关系。以下是实体:
播放器
团队
在我的内容视图中,我使用一个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)
}
}
有什么想法吗?我希望第二个选取器易于复制,因为我最终会非常需要它
发布于 2021-01-13 22:21:47
下面的方法会起作用吗?
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")
}
}
这是一个非常干净的解决方案;一点也不麻烦。
我无法真正测试这段代码,也有一段时间没有用SwiftUI编写代码了,所以如果我在什么地方犯了错误,请原谅。但毫无疑问,您已经领会了其中的含义。:)
https://stackoverflow.com/questions/65709462
复制相似问题