首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >上一个选取器中的选取器值- CoreData/SwiftUI

上一个选取器中的选取器值- CoreData/SwiftUI
EN

Stack Overflow用户
提问于 2021-01-14 04:40:05
回答 1查看 46关注 0票数 0

我有一个在屏幕上有多个选择器的SwiftUI表单。第一个步骤是从存储在Core Data中的数据库中选择一个团队。这些球队中的每一个都与玩家有一对多的关系。以下是实体:

播放器

团队

在我的内容视图中,我使用一个fetch请求从Core Data中获取所有团队,然后我将遍历它们以完成我的选择器。

代码语言:javascript
代码运行次数:0
运行
复制
@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")
    }
}

然后我想在下面有多个选择器,允许你从特定的球队中选择一个单独的球员。我已经尝试了几种方法,但一直没有找到正确的解决方案,而且它们似乎都太过冗长和陈词滥调。我的尝试如下

代码语言:javascript
代码运行次数:0
运行
复制
Picker(selection: $number1, label: Text("#1")){
    ForEach(0..<teams[teamSelected].people!.count){player in
        Text(player.name)
    }
}

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

EN

回答 1

Stack Overflow用户

发布于 2021-01-14 06:21:47

下面的方法会起作用吗?

代码语言:javascript
代码运行次数:0
运行
复制
Picker(selection: $selectedPlayerIndex, label: Text("#1")){
    ForEach(0..<teams[teamSelected].people!.count){playerIndex in
        Text(teams[teamSelected].people![playerIndex].name)
    }
}

因此,对于每个球员索引,您将创建一个文本,其中包含该索引处的球员的名称。

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

代码语言:javascript
代码运行次数:0
运行
复制
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)
            }
        }
    }
}

然后你可以像这样使用它:

代码语言:javascript
代码运行次数:0
运行
复制
@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编写代码了,所以如果我在什么地方犯了错误,请原谅。但毫无疑问,您已经领会了其中的含义。:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65709462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档