【问题标题】:Swift 3: JSON into tableview challengeSwift 3:JSON 到 tableview 挑战
【发布时间】:2017-07-07 12:27:45
【问题描述】:

我有以下 swift3 代码:

    var tempNames = ["Alan","Dan","Mark","Jack","Kelly","Andrew","Paul"]

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "LabelCell", for: indexPath)

    let tempName = tempNames[indexPath.row]
    cell.textLabel?.text = tempName
    cell.detailTextLabel?.text = "Score"

    return cell
}

这会产生以下内容:

如您所见,名称是静态的,而分数就是“分数”一词。以下 JSON 从返回 "https://str8red.com/jsonoverallleaderboard/":

[["shanu", "1056"], ["snookro", "828"], ["tingeypa", "709"], ["shaun", "620"], ["chrakers", "506"]] 

我想做的是使用上面 JSON 中的名称和分数,而不是已经在使用的静态名称和分数。

我查看了 * 并遵循了一些指南,但没有成功。艾伦,对此的任何帮助将不胜感激。

【问题讨论】:

标签: json xcode swift3


【解决方案1】:
  • 创建一个结构

    struct Player {
        let name : String
        var score : String
    }
    
  • 在视图控制器中创建数据源数组

    var players = [Player]()
    
  • 解析包含问题中数组的 JSON 后(假设它位于 [[String]] 类型的变量 jsonPlayers 中)将数组映射到结构

    players = jsonPlayers.map { Player(name: $0[0], score: $0[1]) }
    
  • numberOfRows返回

    return players.count
    
  • cellForRow 中将值分配给标签

    let player = players[indexPath.row]
    cell.textLabel?.text = player.name
    cell.detailTextLabel?.text = player.score
    

【讨论】:

  • 非常感谢,我会尽快尝试上面的解析部分。
  • 解析部分在我对链接问题的回答中有详细描述。学习阅读 JSON。
  • 你好 Vadian,我已经把它们放在一起,但我不知道该放在哪里:/ 如果我将它全部弹出覆盖 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 部分,但它太慢了。如果我将它弹出到类OverallLeagueVC:UITableViewController {部分它只是错误:/
  • cellForRow 中只放更新 UI 的代码,没有别的。将加载数据的代码放在viewDidLoadviewWillAppear 中,具体取决于数据是应该加载一次还是在每个控制器开关上加载。
  • 好的,这是有道理的。但是,当我弹出代码以在 ViewDidLoad 中加载数据时,每当我尝试使用播放器时都会出错。例如,在 numberOfRowsInSection 中,我尝试使用 player.count,但它显示“使用未解析的标识符‘玩家’”。感谢支持,如果这是一个愚蠢的问题,我们深表歉意。