首页 > 解决方案 > 按下 SwiftUI 时更新按钮 UI

问题描述

我有一个包含按钮列表的视图,每个按钮代表一个播放器。我的目标是在按下相应按钮时将一名球员添加到球队中。

struct AddPlayers: View {
    var team: Team
    var playerData = getPlayers()

    var body: some View {
        List(playerData) { player in
            Button(action: {
                addPlayerToTeam(teamID: team.id, playerID: player.id)

                // update the PlayerRow to show player was added to team
            }) {
                PlayerRow(player: player, team: self.team)
            }
        }
        .navigationBarTitle(Text("Players"))
    }
}

struct PlayerRow: View {
    var player: Player
    var team: Team

    var body: some View {

        let view = HStack {
            Text(verbatim: player.FirstName)
            Text(verbatim: player.LastName)

            Spacer()

            // displays true if player is on the team
            if playerInTeam(team: team, player: player) {
                Text("True")
            }
        }

        return view
    }
}

我可以在按下时将玩家添加到团队中,但我还没有弄清楚如何更新 UI。目前,如果我关闭应用程序并重新打开它以强制重新加载 UI,那么它会在正确的播放器上显示“True”。

我试图在每次按下按钮时创建playerData一个@State变量并更新。playerData这会导致该行PlayerRow(player: player, team: self.team)运行,但是PlayerRow永远不会输入的主体,因此不会更新 UI。

struct AddPlayers: View {
    var team: Team
    @State var playerData = getPlayers()

    var body: some View {
        List(playerData) { player in
            Button(action: {
                addPlayerToTeam(teamID: team.id, playerID: player.id)

                // attempt to force reload the List
                playerData = getPlayers()
            }) {
                // called due to playerData = getPlayers()
                PlayerRow(player: player, team: self.team)
            }
        }
        .navigationBarTitle(Text("Players"))
    }
}

struct PlayerRow: View {
    // this sections is run due to playerData = getPlayers()
    var player: Player
    var team: Team

    var body: some View {

        // code does not enter here
        let view = HStack {
            Text(verbatim: player.FirstName)
            Text(verbatim: player.LastName)

            Spacer()

            // displays true if player is on the team
            if playerInTeam(team: team, player: player) {
                Text("True")
            }
        }

        return view
    }
}

感谢所有帮助!

标签: swiftxcodeswiftui

解决方案


推荐阅读