在Swift中使用Rest API中的Array填充UITableview

时间:2016-07-15 07:56:08

标签: json swift uitableview rest alamofire

在我的mainTableView控制器中,我可以在控制台中打印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输出中构造一个数组,以及如何访问这些似乎嵌套在多个维度中的字段, 作为菜鸟,thx用于任何输入。

从类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)
            }
    }
}

2 个答案:

答案 0 :(得分:1)

在您的TODO点:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
 $resolver->setDefaults(array(
 'data_class' => '...',
 'csrf_protection' => false
 ));
}

在快速尝试SwiftyJSON时更容易处理json。

答案 1 :(得分:0)

我现在明白了。需要在numberOfRowsSelection中传递内部resultList数组的大小。然后它动态加载单元格。

override func tableView(tableView: UITableView, numberOfRowsInSection    
section: Int) -> Int {
    print("size of self.resultlist.count: ")
    print(self.resultList.count)

    //size of the inner array with all the acutal values have to be 0 
at the beginning. when the async call comes back with the whole 
result, it will be updated. so it has to be set to the size of the 
array

//http://www.unknownerror.org/opensource/Alamofire/Alamofire/q/stackoverflow/29728221/uitableview-got-rendered-before-data-from-api-returned-using-swiftyjson-and-alam

    return self.resultList.count
}