使用使用SwiftyJSON的函数填充Tableview [英] populating Tableview with a function that uses SwiftyJSON

查看:128
本文介绍了使用使用SwiftyJSON的函数填充Tableview的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个函数,该函数从JSON字符串中返回已解析的信息.

I have a function that returns parsed information out of a JSON string.

 var info = [AppModel]()



    func getEarthquakeInfo(completion: (results : NSArray?) ->Void ){

        DataManager.getEarthquakeDataFromFileWithSuccess {
            (data) -> Void in

                let json = JSON(data: data)


                if let JsonArray =  json.array {

                    for appDict in JsonArray {
                        var ids: String? = appDict["id"].stringValue
                        var title: String? = appDict["title"].stringValue
                        var time: String? = appDict["time"].stringValue
                        var information = AppModel(idEarth: ids, title: title, time: time)

                        self.info.append(information)
                        completion(results: self.info)
                    }


            }

        }



    }

此函数使用SwiftyJSON并使用我的DataManager类调用Web服务.当我在功能之外打印出来时,我会得到所需的所有信息.现在,我想使用标题信息来填充我的TableView.在我的cellForRowAtIndexPath内部,我尝试过滤掉Earth信息,以便仅获取标题并将其放入数组中,并使用该数组填充tableView.到目前为止,我一直没有成功,而且我一直到处都在寻找如何执行此操作的方法,但没有尝试过或发现没有任何效果.有人可以指出正确的方向吗? 到目前为止,我已经完成了什么:

This function uses SwiftyJSON and calls the web service using my DataManager class. When I print it out outside the function I get all the information I need. Now I want to use the title information to populate my TableView. Inside my cellForRowAtIndexPath I've tried filtering out my Earthinformation so that I could get just the title and put that into an array, and populate my tableView with that array. So far I've been unsuccessful, and I've been looking everywhere on how to do this and nothing I've tried or found worked. Can someone point me in the right direction on how to do this? What I've done so far:

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


        getEarthquakeInfo( { (info) -> Void in
            var Earthinformation = self.info as NSArray
           let titleArray = Earthinformation["TITLE"] as NSArray // error: type int does not conform to protocol "StringLiteralConvertible"
            cell.textLabel!.text = titleArray[indexPath.row]


                   })


        return cell



    }

当我打印出地球信息时得到3条记录:ID:146323,标题:M 1.6-27km E Coso Junction,加利福尼亚州,时间:2015-04-15 14:08:20 UTC, ,ID:146346,标题:M 1.8-26km E of Coso Junction,California,时间:2015-04-15 14:08:20 UTC, ,ID:146324,标题:M 2.4-26km NW of Anchor Point,阿拉斯加,时间:2015-04-15 13:33:36 UTC,

3 records I get when I print out Earthinformation I get: ID: 146323, TITLE: M 1.6 - 27km E of Coso Junction, California, TIME: 2015-04-15 14:08:20 UTC, , ID: 146346, TITLE: M 1.8 - 26km E of Coso Junction, California, TIME: 2015-04-15 14:08:20 UTC, , ID: 146324, TITLE: M 2.4 - 26km NW of Anchor Point, Alaska, TIME: 2015-04-15 13:33:36 UTC,

抱歉,我应该在此之前加入: 我的AppModel.swift:

Sorry I should have included this before: My AppModel.swift:

class AppModel: NSObject, Printable {
    let idEarth: String
    let title: String
    let time: String


    override var description: String {
        return "ID: \(idEarth), TITLE: \(title), TIME: \(time), \n"
    }



    init(idEarth: String?, title: String?, time: String?) {
        self.idEarth = idEarth ?? ""
        self.title = title ?? ""
        self.time = time ?? ""
    }

}

还有我的DataManager.swift文件:

And my DataManager.swift file:

let earthquakeURL = "http://www.kuakes.com/json/"
class DataManager {
    class func getEarthquakeDataFromFileWithSuccess(success: ((websiteData: NSData) -> Void)) {
        //1
        loadDataFromURL(NSURL(string: earthquakeURL)!, completion:{(data, error) -> Void in
            //2
            if let urlData = data {
                //3
                success(websiteData: urlData)
            }
        })
 }


    class func loadDataFromURL(url: NSURL, completion:(data: NSData?, error: NSError?) -> Void) {
        var session = NSURLSession.sharedSession()

        // Use NSURLSession to get data from an NSURL
        let loadDataTask = session.dataTaskWithURL(url, completionHandler: { (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
            if let responseError = error {
                completion(data: nil, error: responseError)
            } else if let httpResponse = response as? NSHTTPURLResponse {
                if httpResponse.statusCode != 200 {
                    var statusError = NSError(domain:"com.kuakes", code:httpResponse.statusCode, userInfo:[NSLocalizedDescriptionKey : "HTTP status code has unexpected value."])
                    completion(data: nil, error: statusError)
                } else {
                    completion(data: data, error: nil)
                }
            }
        })

        loadDataTask.resume()
    }


}

推荐答案

每次创建单元格时,您都在调用getEarthquakeInfo函数.这是非常不必要的,并且可能导致意外的行为(参见getEarthquakeInfo函数是异步的).我建议您利用已经有一个模型数组信息来填充表格视图这一事实.在viewDidLoad中,调用您的异步函数以检索模型数组的数据.示例:

You are calling your getEarthquakeInfo function every time a cell is to be created. This is very unnecessary and may cause unintentional behavior (seeing as the getEarthquakeInfo function is asynchronous). I recommend utilizing the fact that you have a model array info already to use to populate your tableview. In viewDidLoad call your asynchronous function to retrieve the data for the model array. Example:

override func viewDidLoad() {
   super.viewDidLoad()
   getEarthquakeInfo { (info) in
       // Your model array is now populated so we should reload our data
       self.tableView.reloadData() 
   }
}

现在,调整您的UITableViewDataSource函数以正确处理模型数组.请注意,我假设您的info数组是填充tableView的UITableViewController的属性.示例:

Now, adjust your UITableViewDataSource functions to properly handle the model array. Note that I am assuming that your info array is a property of the UITableViewController that is populating the tableView. Example:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->   UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier",
                         forIndexPath: indexPath) as UITableViewCell
    // Note that I have no idea how you access the title of your AppModel
    // object so you may have to adjust the below code
    cell.textLabel!.text = self.info[indexPath.row].title 

    return cell
}

override func numberOfSectionsInTableView() {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) {
    return info.count
}

这篇关于使用使用SwiftyJSON的函数填充Tableview的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆