Swift UITableView:如何从JSON加载数据

时间:2016-08-22 10:00:11

标签: json swift uitableview

我是Swift的初学者,想为我的第一个应用程序提供一些帮助。我希望我能够很好地解释它。我正在开发和应用程序,它从JSON文件加载信息。您是否有人知道如何将此信息填充到UI表视图单元格中。我开发了3个视图控制器,在第一个我有一个按钮,用户必须按下,第二个Tableview控制器将被打开。我已经看过如何填充它的教程,但似乎它不起作用。第三个是Table View Cells.let我告诉你:

class TableViewController: UITableViewController {
@IBOutlet weak var Bar: UIToolbar!
var TableData:Array< String > = Array < String >()
let ImageList = ["",""]
var TitleList = ["",""]
let DescriptionList = ["",""]

我必须在单元格中显示图像,标题和描述。 这是JSON文件:

 {
 “fruits” : [
 {
 “Name” : “Fruit1”,
 “Picture”:”http://www.starpropertiesindia.com/blog/wp-   content/uploads/2016/08/kochi1.jpg”,
“Description”:””,
},

  {
 “Name” : “Fruit2”,
 “Picture”:”http://www.starpropertiesindia.com/blog/wp-content/uploads/2016/08/kochi1.jpg”,
 “Description”:””,

},

如果有人建议我如何继续,我会非常感激..

在新视图中准备segue:

@IBOutlet weak var CellDescription: UILabel!
@IBOutlet weak var CellImage: UIImageView!
@IBOutlet weak var CellTitle: UILabel!
override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

3 个答案:

答案 0 :(得分:7)

首先,不要为数据源使用多个数组。它们非常容易出错,因为您有责任保持项目数量的同步。

  • 由于Swift是一种面向对象的语言,因此使用自定义结构作为模型

    struct Fruit {
      let name : String
      let imageURL : NSURL
      let description : String
    }
    
  • 声明一个Fruit的空Swift数组作为数据源数组。基本上使用始终 Swift本机集合类型(而不是NSArrayNSDictionary),因为它们包含类型信息。

    var fruits = [Fruit]()
    
  • 创建一个解析JSON的函数并重新加载表视图。该代码假定JSON文件名为jsonFile.json,位于应用程序包中。此外,它使用SwiftyJSON库。

    func parseFruits() {
      guard let url = NSBundle.mainBundle().URLForResource("jsonFile", withExtension: "json"), jsonData = NSData(contentsOfURL: url) else {
        print("Error finding JSON File")
        return
      }
    
      let jsonObject = JSON(data: jsonData)
    
      let fruitArray = jsonObject["fruits"].arrayValue
      for aFruit in fruitArray {
        let name = aFruit["Name"].stringValue
        let imageURL = aFruit["Picture"].stringValue
        let description = aFruit["Description"].stringValue
    
        let fruit = Fruit(name: name, imageURL: NSURL(string:imageURL)!, description:description)
        fruits.append(fruit)
      }
    
      self.tableView.reloadData()
    }
    
  • viewWillAppear中调用解析函数

    override func viewWillAppear() {
      super.viewWillAppear()
      parseFruits()
    }
    
  • 这些是表视图数据源委托方法,假设单元格的标识符为Cell,单元格的样式为Right DetailSubtitle

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      return fruits.count
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
      let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
      let fruit = fruits[indexPath.row]
      cell.textLabel!.text = fruit.name
      cell.detailTextLabel?.text = fruit.description
      // add code to download the image from fruit.imageURL
      return cell
    }
    

编辑:

在Swift 4中,一切都变得更短更方便。最重要的变化是放弃SwiftyJSON并使用Decodable

struct Fruit : Decodable {
   let name : String
   let imageURL : URL
   let description : String
}

func parseFruits() {
    let url = Bundle.main.url(forResource:"jsonFile", withExtension: "json")!
    let jsonData = try! Data(contentsOfURL: url)
    self.fruits = try! JSONDecoder().decode([Fruit].self, from: jsonData)
    self.tableView.reloadData()
}

答案 1 :(得分:0)

你有Json数据,只需要将它放在一个数组中并将它们加载到表视图中,如下所示:

    var tableData:NSArray = []

    self.tableData = json["fruits"] as! NSArray
    // In the place of json put your json object
    self.tableView.reloadData()

}

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 {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell

    let item = self.tableData[indexPath.row] as! [String : String]
    cell.nameLabel?.text = item["Name"]
    cell.descriptionLabel?.text = item["Description"]

    return cell
}

答案 2 :(得分:0)

试试这会帮助你

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

        var dict = array[indexPath.row]
        cell.lbl1.text = dict["Name"] as? String
        cell.lbl2.text = dict["ad_created_date"] as? String
        cell.lbl3.text = dict["phone_number"] as? String
        cell.lbl4.text = dict["id"] as? String
        cell.lbl5.text = dict["ad_zip"] as? String

        let imageUrlString = dict["Picture"]
        let imageUrl:URL = URL(string: imageUrlString as! String)!
        let imageData:NSData = NSData(contentsOf: imageUrl)!
        cell.img.image = UIImage(data: imageData as Data)



        return cell
    }