UITableViewController没有填充 - 数据应该可用

时间:2015-12-09 04:30:55

标签: ios swift2 alamofire swifty-json

所以我一直在尝试使用来自互联网的一些JSON data来填充TableViewController。 TableViewController只是不显示数据。我已经调试过并试图追踪我的常数& vars尽可能多地查看我是否收到了错误的数据,但数据似乎没问题。

import UIKit
import SwiftyJSON
import Alamofire

class TableController: UITableViewController  {

    var TableData:Array < Datenstruktur > = Array < Datenstruktur>()

    let serverURL = "http://api.androidhive.info/contacts/"

    struct Datenstruktur{
        var name:String?
        var email:String?

        init(add: NSDictionary){
            name = add["name"] as? String
            email = add["email"] as? String
        }

    }

    @IBOutlet var tableview: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        //tableview.dataSource = self
        //tableview.delegate = self

        get_data_from_server(serverURL)

        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem()
    }

所以这将是我为我的TableData创建的结构以及我的viewDidLoad(),它基本上只调用函数get_data_from_server(serevrURL)

跟进是我的tableView函数

   override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return TableData.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) //as! UITableViewCell

        let data = TableData[indexPath.row]

        cell.textLabel?.text = data.name
        cell.detailTextLabel?.text = data.email

        return cell
    }

在我func get_data_from_server()我使用最新的Alamofire框架从服务器获取json。由于我也使用SwiftyJSON,所以收到的JSON被解析并在另一个func调用中使用,其中实际应该填充数据extract_json()

    func do_table_refresh()
    {
        dispatch_async(dispatch_get_main_queue(), {
            self.tableview.reloadData()
            return
        })
    }

    func get_data_from_server(url:String)
    {
        Alamofire.request(.GET, url).validate().responseJSON { response in
            switch response.result {
            case .Success:
                if let value = response.result.value {
                    let json = JSON(value)

                    self.extract_json(json)

                }
            case .Failure(let error):
                print(error)
            }
        }

    }

    func extract_json(data:JSON)
    {


        let jsonData: JSON = data

        var namesDictionary: Dictionary<String, String> = [:]

        for var i = 0; i < jsonData["contacts"].count ; i++ {
            print(i)

            namesDictionary["name"] = jsonData["contacts"][i]["name"].stringValue
            namesDictionary["email"] = jsonData["contacts"][i]["name"].stringValue
            TableData.append(Datenstruktur(add: namesDictionary))

        }

        //do_table_refresh()

        }
    }
}

正如您所看到的,我还有一个do_table_refresh()来重新加载tableview的数据 - 但是当我尝试使用它时,我得到了Thread1: EXC_BAD_INSTRUCTION (code=EXC...

我也试过print(TableData)并且我已经看到里面确实有数据,但是它的可选..我需要打开它还是什么?我觉得我的代码几乎没问题......至少就我能跟踪数据而言:D

仅供参考:我实际上是Swift的新手,我也没有任何ObjectiveC经验 - 但我有C,C ++和Java背景......

非常感谢帮助 谢谢!

编辑: 我修好了! 在我的Alamofire.request(在get_data_from_server()内)添加此内容后,我的TableView填充了数据。

        if self.TableData.count > 0 {
                    self.tableView.reloadData()
        }

所以我的get_data_from_server()现在看起来像这样:

func get_data_from_server(url:String)
{
    Alamofire.request(.GET, url).validate().responseJSON { response in
        switch response.result {
        case .Success:
            if let value = response.result.value {
                let json = JSON(value)
                self.extract_json(json)

                if self.TableData.count > 0 {
                    self.tableView.reloadData()
                }
            }
        case .Failure(let error):
            print(error)
        }
    }

}

由于我没有使用do_table_refresh()我想我会删除它。我已经在某处读过我的Alamofire请求无论如何都不会在这个调度队列中结束。所以我的问题是为什么会这样?什么实际上最终在该队列中,所以什么时候使用dispatch_asynch(dispatch_get_main_queue(),{})

0 个答案:

没有答案