根据后端数据为UITableView中的节设置数据源

时间:2018-08-14 15:41:31

标签: ios swift uitableview

我正在学习如何利用表格视图和表格视图单元格,今天我想练习在表格视图中使用节。设置节标题并将数据分类到这些特定节中非常容易,尤其是在使用枚举时。

为了使其更具挑战性,我想看看将基于团队名称的部分标题存储在Firebase上并使行由属于该特定团队的用户组成将是多么困难。我已经意识到,对于仍在学习Swift的人来说,这是极其困难的。

此处显示了该结构在Firebase上的外观:

enter image description here

用户可以创建自己的团队名称,这些团队名称将用作标题。因此,我要做的是创建一个字符串数组,观察团队名称并将其添加到该数组中。从那里,我将各部分的标题设置为每个团队的名称。 我遇到的问题是将正确的用户归入每个团队。

如果有40个团队,我可以轻松地创建40个标题正确的部分,但似乎无法弄清楚如何将每个用户分类为正确的部分。

1 个答案:

答案 0 :(得分:1)

这是您问题的简单实现。您有一个播放器类,它是您的Firebase数据。

class Player {
    var name: String
    var teamName: String

    init(name: String, teamName: String) {
        self.name = name
        self.teamName = teamName
    }
}

创建一个Team类来存储您的部分数据。

class Team {
    var teamName: String
    var players: [Player]

    init(teamName: String, players: [Player]) {
        self.teamName = teamName
        self.players = players
    }
}

从Firebase获得数据后,将所有播放器存储在数组players中。现在,您可以使用一种方法,该方法返回一个包含Team个对象的数组,这些对象具有teamNameplayers,该数组是一个包含共享相同teamName < / p>

func getTeams() -> [Team] {
    var teams: [Team] = []
    while !players.isEmpty {
        guard let referencePlayer = players.first else {
            print("All players sorted.")
            return []
        }
        let filteredPlayers = players.filter { (player) -> Bool in
            return player.teamName == referencePlayer.teamName
        }
        players.removeAll { (player) -> Bool in
            return player.teamName == referencePlayer.teamName
        }
        let team = Team(teamName: referencePlayer.teamName, players: filteredPlayers)
        teams.append(team)
    }
    return teams
}

现在在viewDidLoad中调用此方法并重新加载表。

func numberOfSections(in tableView: UITableView) -> Int {
    return teams.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return teams[section].players.count
}