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

时间:2015-12-30 11:23:25

标签: ios json swift uitableview swifty-json

我是swift的新手,不知道为什么UITableView没有显示来自JSON数组的动态数据。 我希望使用swiftyJSON从ITunes获取顶级应用列表,然后根据解析后的数据创建动态表。 我的问题是,当我运行此代码时,我得到的所有代码都是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
        }


}

输出:

enter image description here

3 个答案:

答案 0 :(得分:4)

请勿在{{1​​}}内请求数据。例如,在cellForRowAtIndexPath触发 viewDidLoad的tableview中请求数据。

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

什么是

reload
应该怎么做?您为每个单元格运行该代码。您总是多次分配var appName : String! if let appArray = json["feed"]["entry"].array { for appDict in appArray { appName = appDict["im:name"]["label"].string } } cell.textLabel!.text = appName appName总是最终成为找到的姓氏。因此,所有标签都将获得相同的文本集。

解决方案总结。

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

答案 1 :(得分:1)

应该在封闭内部调用重新加载。 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()
    }

}

答案 2 :(得分:0)

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

代码:

//
//  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
        }


}

输出:

enter image description here