json - 在 Swift 中使用来自 Rest API 的数组填充 UITableview

标签 json swift uitableview rest alamofire

在我的 mainTableView Controller 中,我可以在控制台中打印 API 结果,但我不知道如何将它们设置为在我的 tableview 的单元格中可见

import UIKit
//from: https://github.com/Ramotion/folding-cell
class MainTableViewController: UITableViewController {

let kCloseCellHeight: CGFloat = 179
let kOpenCellHeight: CGFloat = 488

let kRowsCount = 100

var cellHeights = [CGFloat]()
var restApi = RestApiManager()
var items: NSDictionary = [:]


override func viewDidLoad() {
    super.viewDidLoad()

    restApi.makeCall() { responseObject, error in
        // use responseObject and error here
        //  self.json = JSON(responseObject!)

        print("print the json data from api ")
        self.items = NSDictionary(dictionary: responseObject!)
        self.tableView.reloadData()
        print(responseObject!.count)
       // print(self.items)
        let resultList = self.items["result"] as! [[String: 
 AnyObject]]
        print(resultList[5])
    }

    createCellHeightsArray()
    self.tableView.backgroundColor = UIColor(patternImage: 
  UIImage(named: "background")!)


}

// MARK: configure
func createCellHeightsArray() {
    for _ in 0...kRowsCount {
        cellHeights.append(kCloseCellHeight)
    }
}

// MARK: - Table view data source

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 10
}

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    guard case let cell as DemoCell = cell else {
        return
    }

    cell.backgroundColor = UIColor.clearColor()

    if cellHeights[indexPath.row] == kCloseCellHeight {
        cell.selectedAnimation(false, animated: false, completion:nil)
    } else {
        cell.selectedAnimation(true, animated: false, completion: nil)
    }

    cell.number = indexPath.row
}


// with as! the cell is set to the custom cell class: DemoCell
// afterwards all data can be loaded in this method
override func tableView(tableView: UITableView, cellForRowAtIndexPath    
indexPath: NSIndexPath) -> UITableViewCell {
    let cell = 
tableView.dequeueReusableCellWithIdentifier("FoldingCell", 
forIndexPath: indexPath) as! DemoCell

//TODO: set all custom cell properties here (retrieve JSON and set in 
cell), use indexPath.row as arraypointer

//    let resultList = self.items["result"] as! [[String: AnyObject]]
 //   let itemForThisRow = resultList[indexPath.row]
//  cell.schoolIntroText.text = itemForThisRow["name"] as! String

    cell.schoolIntroText.text = "We from xx University..."
    return cell
}

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return cellHeights[indexPath.row]
}

// MARK: Table vie delegate

override func tableView(tableView: UITableView, 
didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let cell = tableView.cellForRowAtIndexPath(indexPath) as! 
FoldingCell

    if cell.isAnimating() {
        return
    }

    var duration = 0.0
    if cellHeights[indexPath.row] == kCloseCellHeight { // open cell
        cellHeights[indexPath.row] = kOpenCellHeight
        cell.selectedAnimation(true, animated: true, completion: nil)
        duration = 0.5
    } else {// close cell
        cellHeights[indexPath.row] = kCloseCellHeight
        cell.selectedAnimation(false, animated: true, completion: 
nil)
        duration = 0.8
    }

    UIView.animateWithDuration(duration, delay: 0, options: 
.CurveEaseOut, animations: { () -> Void in
        tableView.beginUpdates()
        tableView.endUpdates()
        }, completion: nil)


}    
}

我得到的结果是正确的 JSON

{
 result =     (
            {
        city = Perth;
        "cou_id" = AU;
        environment = R;
        image = "-";
        name = "Phoenix English";
        rating = 0;
        "sco_id" = 2;
        "sco_type" = LS;
    },
            {
        city = "Perth ";
        "cou_id" = AU;
        environment = L;
        image = "-";
        name = "Milner college";
        rating = 0;
        "sco_id" = 3;
        "sco_type" = LS;
    },

我需要做什么来设置这些值并在此处设置它们?

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("FoldingCell", forIndexPath: indexPath) as! DemoCell
    //TODO: set all custom cell properties here (retrieve JSON and set in cell), use indexPath.row as arraypointer

    cell.schoolIntroText.text = "We from xx University..."
    return cell
}

我不知道如何从这个 JSON 输出构造一个数组以及如何访问这些似乎嵌套在许多维度中的字段, 作为菜鸟,感谢任何输入。

从类 restApi 添加:

// working method for calling api
func makeCall(completionHandler: (NSDictionary?, NSError?) -> ()) {

    Alamofire.request(
        .GET,
        baseURL+schools+nonAcademicParameter,
        headers: accessToken
        )
        .responseJSON { response in
            switch response.result {
            case .Success(let value):
                completionHandler(value as? NSDictionary, nil)
            case .Failure(let error):
                completionHandler(nil, error)
            }
    }
}

最佳答案

在你的 TODO 点:

let resultList = self.items["result"] as! [[String: AnyObject]]
let itemForThisRow = resultList[indexPath.row]
cell.cityLabel.text = itemForThisRow["city"] as! String
cell.nameLabel.text = itemForThisRow["name"] as! String
...

为了在 swift 中更容易处理 json,请尝试 SwiftyJSON .

关于json - 在 Swift 中使用来自 Rest API 的数组填充 UITableview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38390806/

相关文章:

java - Gson.toJson Stackoverflow错误

javascript - Json 字符串化更改日期

java - Jersey MOXy 不解析 Snake_case

java - 如何使用 Java 将 JSON 值存入字符串数组?

swift - 为什么 Swift 的三元运算符对空格如此挑剔?

swift - 将框架添加到框架项目后单元测试失败

swift - 为什么我不能创建一个名为 '!' 的后缀运算符

ios - 带有标题 View 的 UITableView 不滚动到顶部

ios - 如何在自定义单元格中保存多个选定的按钮?

iphone - UITableView 部分索引未按预期工作