来自先前选择器的选择器值 - 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的主要内容,如果未能解决你的问题,请参考以下文章