远程数据不会在tableView上显示

时间:2016-08-24 22:45:39

标签: swift tableview remote-access

我对什么是错的一无所知。我的控制台没有给我任何错误,我的代码似乎很好,但没有任何显示。有人可以查看我的代码,看看为什么它不想工作?我的tableView与其委托和源连接。不确定是什么问题。

这是我的代码:

private let cellIdentifier = "cell"
private let apiURL = "api link"


class TableView: UITableViewController {


//TableView Outlet
@IBOutlet weak var LegTableView: UITableView!


//API Array
var legislatorArray = [congressClass]()


func getLegislators (fromSession session: NSURLSession) {

    //Calling url
    if let jsonData = NSURL(string: apiURL) {

        // Requesting url
        let task = session.dataTaskWithURL(jsonData) {(data, response, error) -> Void in
            //Check for errors
            if let error = error {print(error)
            } else {
                if let http = response as? NSHTTPURLResponse {
                    if http.statusCode == 200 {

                        //Getting data
                        if let data = data {

                            do {

                                let legislatorData = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers)

                                //Get API data
                                if let getData = legislatorData as? [NSObject:AnyObject],
                                    findObject = getData["results"] as? [AnyObject]{

                                    //Return data
                                    for cellFound in findObject{

                                        if let nextCell = cellFound["results"] as? [NSObject:AnyObject],

                                            name = nextCell["first_name"] as? String,
                                            lastName = nextCell["last_name"] as? String,
                                            title = nextCell["title"] as? String,
                                            partyRep = nextCell["party"] as? String,
                                            position = nextCell ["position"] as? String,
                                            id = nextCell ["bioguide_id"] as? String

                                        {

                                            //Add data to array
                                            let addData = congressClass(name: name, lastName: lastName, title: title, party: partyRep, position: position, bioID: id)
                                            self.legislatorArray.append(addData)
                                        }
                                    }//end cellFound

                                    //Adding data to table
                                    dispatch_async(dispatch_get_main_queue()) { () -> Void in
                                        self.tableView.reloadData()
                                    }
                                }
                            }

                                //end do
                            catch {print(error)}

                        }//end data

                    }//end statusCode

                }//end http

            }//else

        }//end task

        //Run code
        task.resume()

    }//end jsonData


}



override func viewDidLoad() {
    super.viewDidLoad()

    let sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration()
    let urlSession = NSURLSession(configuration: sessionConfig)
    getLegislators(fromSession: urlSession)

}

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

// MARK: - Table view data source

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

   //TableView Rows
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return legislatorArray.count
    //return 5
}

//Cell Configuration
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell  = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! CellTableView

    cell.lesName?.text = legislatorArray[indexPath.row].name + " " + legislatorArray[indexPath.row].lastName
    cell.lesTitle?.text = legislatorArray[indexPath.row].title
    cell.lesParty?.text = legislatorArray[indexPath.row].party

    //These tests worked fine.. the tableView is working. But the data doesn't seem to pass.
    //cell.lesName.text = "Name" + " " + "lastName"
    //cell.lesTitle.text = "Title goes here"
    //cell.lesParty.text = "D"

    return cell
}
}

1 个答案:

答案 0 :(得分:2)

您没有重新加载tableView

问题在于这段代码

                                //-----------------------------

                                //New empty array for api data
                                var indexPath:[NSIndexPath] = []

                                //Adding data to new array
                                for i in 0..<self.legislatorArray.count{
                                    let secondIndexPath = NSIndexPath(forRow: i, inSection: 0)
                                    indexPath.append(secondIndexPath)
                                }

                                //Adding data to table
                                dispatch_async(dispatch_get_main_queue()) { () -> Void in
                                    self.tableView.insertRowsAtIndexPaths(indexPath, withRowAnimation: .Left)
                                }

你不需要任何这些。您可以按如下方式重新加载tableView:

                            //Adding data to table
                            dispatch_async(dispatch_get_main_queue()) { () -> Void in
                                //You only need to reload it and that should do the trick
                                self.tableView.reloadData()
                            }

我知道你说你的tableView已连接到delegate和dataSource,但它没有显示在你的代码中。

您将ViewController符合正确的协议,但在viewDidLoad中需要这样的内容。

self.tableView.deletage = self
self.tableView.dataSource = self
//I don't know if this was a typo but in your cellForRowAtIndexPath you are using CellTableView
let nibName = UINib(nibName: "CellTableView", bundle:nil)
self.tableView.registerNib(nibName, forCellReuseIdentifier: cellIdentifier)

我为您的实现创建了一个更好的设计示例 这适用于WebService和您的自定义类 https://github.com/phantomon/Stackoverflow/blob/master/SO1/MyTableView/MyTableView/Models/WebServiceManager.swift

这适用于带有tableView的ViewController https://github.com/phantomon/Stackoverflow/blob/master/SO1/MyTableView/MyTableView/ViewController.swift

您只需要使用自定义的UITableViewCell修改UITableViewCell。 当然,请查看您的自定义类数据。