【问题标题】:Picker Values from a previous picker - CoreData/SwiftUI来自先前选择器的选择器值 - 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)
    }
}

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

【问题讨论】:

    标签: swift core-data swiftui picker


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 2021-07-18
      相关资源
      最近更新 更多