user2039697 user2039697 - 4 months ago 14
JSON Question

Populate UITableview with Array from Rest API in Swift

In my mainTableView Controller, I can print the API result in the console but I have no idea how I can set these to be visible in the cells of my 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)


}
}


I get this result in JSON which is correct

{
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;
},


what do I have to do to set these values and set them here?

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
}


I somehow dont figure out how to construct an array from this JSON output and how to access these fields which seem to be nested in many dimensions,
as a noob, thx for any inputs.

Addition from class 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)
}
}
}

Answer

At your TODO point:

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
...

To make dealing with json easier in swift try SwiftyJSON.

Comments