无法将已解析 JSON 的列表显示到 TableView 中

Can't show list of parsed JSON into TableView

我是 swift 的新手,不知道为什么 UITableView 不显示来自 JSON 数组的动态数据。 我想使用 swiftyJSON 从 iTunes 获取热门应用列表,然后根据解析的数据创建一个动态的 table。 我的问题是当我 运行 我用下面的代码得到的所有代码是 5 行,其中的值相同,如下图

我怎样才能使它动态化以及我在哪里弄错了? 提前致谢。

更新代码:

import UIKit



struct Apps {
    var name : String!
}

class createTable: UITableViewController {

     var tableData = [Apps]()

    //Mark Properties
    @IBOutlet var appTableView : UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()


        //Get the #1 app name from iTunes and SwiftyJSON
        DataManager.getTopAppsDataFromItunesWithSuccess { (iTunesData) -> Void in
            let json = JSON(data: iTunesData)


            if let appArray = json["feed"]["entry"].array {
                for appDict in appArray {
                    let appName : String! = appDict["im:name"]["label"].string
                     let ap = Apps(name: appName)
                    self.tableData.append(ap)

                }
            }
        }

        self.tableView.reloadData()
    }



    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }



        override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
            return 1
        }


           override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                return self.tableData.count
            }


           override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell  {

                //Table view cells are reused and should be dequeued using a cell identifier.
                let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)

                    let rowData = self.tableData[indexPath.row]
                    cell.textLabel!.text = rowData.name


            return cell
        }


}

输出:

不要请求 cellForRowAtIndexPath 中的数据。请求数据例如 viewDidLoadtrigger a reload 的 tableview.

创建一个包含所需数据的自定义 class,创建这些自定义 class 的数组,为每个单元格使用该自定义 class 的一个元素。

什么是

var appName : String!
if let appArray = json["feed"]["entry"].array {
    for appDict in appArray {
         appName = appDict["im:name"]["label"].string
    }
}
cell.textLabel!.text = appName

应该怎么办?您 运行 为 每个 单元格编写代码。您总是多次分配 appNameappName 总是最后找到的姓氏。因此所有标签都将获得相同的文本集。

解决方案总结。

  • 创建一个 class App 其中包含一个 属性 name(稍后更多)
  • 从您的 viewDidLoad
  • 中的 AppStore 请求数据
  • 解析检索到的数据,创建 App 的实例,每个实例都设置了名称,将这些实例存储在数组中 var apps = [App]()
  • 触发 tableView 的重新加载
  • 在你的cellForRowAtIndexPath中检索对应于单元格索引
  • App
  • return apps.count 在你的 numberOfRowsInSection
  • 里面

Reload 应该在闭包内调用。 DataManager 异步获取应用列表,数据解析后不调用刷新

    override func viewDidLoad() {
    super.viewDidLoad()


    //Get the #1 app name from iTunes and SwiftyJSON
    DataManager.getTopAppsDataFromItunesWithSuccess { (iTunesData) -> Void in
        let json = JSON(data: iTunesData)

        if let appArray = json["feed"]["entry"].array {
            for appDict in appArray {
                let appName : String! = appDict["im:name"]["label"].string
                let ap = Apps(name: appName)
                self.tableData.append(ap)

            }
        }

        tableView.reloadData()
    }

}

我正在为那些想要使用它的人发布结果代码。

代码:

//
//  createTable.swift
//  TopApps


import UIKit



struct Apps {
    var name : String!
}

class createTable: UITableViewController {

     var tableData = [Apps]()

    //Mark Properties
    @IBOutlet var appTableView : UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()


        //Get the #1 app name from iTunes and SwiftyJSON
        DataManager.getTopAppsDataFromItunesWithSuccess { (iTunesData) -> Void in
            let json = JSON(data: iTunesData)


            if let appArray = json["feed"]["entry"].array {
                for appDict in appArray {
                    let appName : String! = appDict["im:name"]["label"].string
                     let ap = Apps(name: appName)
                    self.tableData.append(ap)

                    self.tableView.reloadData()

                }
            }
        }


    }



    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }



        override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
            return 1
        }


           override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                return self.tableData.count
            }


           override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell  {

                //Table view cells are reused and should be dequeued using a cell identifier.
                let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)

                    let rowData = self.tableData[indexPath.row]
                    cell.textLabel!.text = rowData.name


            return cell
        }


}

输出: