从JSON重新加载数据tableView

时间:2015-12-11 12:43:58

标签: ios swift uitableview

我在iOS的简单swift应用程序中重新加载tableView中的数据有问题。

如果我第一次在cityTextField中输入城市名称并按下getDataButton,那么数据显示正确,但如果我将新城市名称输入cityTextField并按下按钮, 所以数据仍然与第一个城市相同

的ViewController

import UIKit

class ViewController: UIViewController,UITableViewDelegate {

var arrDict :NSMutableArray=[]

@IBOutlet weak var cityTextField: UITextField!
@IBOutlet weak var weatherTableView: UITableView!


@IBAction func getDataButton(sender: AnyObject) {

    weatherDataSource("http://api.openweathermap.org/data/2.5/forecast?q=" + cityTextField.text! + "&appid=<app id>")

}

override func viewDidLoad() {
    super.viewDidLoad()

}

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


func weatherDataSource(urlString: String) {

    let urlUTF = urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)

    let url = NSURL(string: urlUTF!)

        let query = NSURLSession.sharedSession().dataTaskWithURL(url!) { (data, response, error) in dispatch_async(dispatch_get_main_queue(), { ()
            self.loadDataWeather(data!)
            self.weatherTableView.reloadData()
            })
        }
        query.resume()
}


func loadDataWeather(dataPocasi: NSData){

    do {
        if let json = try NSJSONSerialization.JSONObjectWithData(dataPocasi, options: []) as? NSDictionary {
            print(json)

            for var i = 0 ; i < (json.valueForKey("list") as! NSArray).count ; i++
            {
                arrDict.addObject((json.valueForKey("list") as! NSArray) .objectAtIndex(i))
            }
        }

    } catch {
        print(error)
    }


}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return arrDict.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    var cell : TableViewCell! = tableView.dequeueReusableCellWithIdentifier("Cell") as! TableViewCell

    if(cell == nil)

    {
        cell = NSBundle.mainBundle().loadNibNamed("Cell", owner: self, options: nil)[0] as! TableViewCell;
    }
    let strTitle : NSNumber=arrDict[indexPath.row] .valueForKey("dt") as! NSNumber
    let epocTime = NSTimeInterval(strTitle)
    let myDate = NSDate(timeIntervalSince1970:  epocTime)
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "hh:mm"
    let dateString = dateFormatter.stringFromDate(myDate)
    cell.dayLabel.text=dateString

    let strDescription : NSDictionary=arrDict[indexPath.row] .objectForKey("main") as! NSDictionary
    if let bla = strDescription["temp"]{
        cell.tempLabel.text=bla.stringValue
    }
    return cell as TableViewCell
}

}

TableViewCell

import UIKit

class TableViewCell: UITableViewCell{
@IBOutlet weak var dayLabel: UILabel!
@IBOutlet weak var tempLabel: UILabel!
}

2 个答案:

答案 0 :(得分:0)

您可以在“loadDataWether()”函数中重新加载tableview。

像,

func loadDataWeather(dataPocasi: NSData){

    do {
        if let json = try NSJSONSerialization.JSONObjectWithData(dataPocasi, options: []) as? NSDictionary {
            print(json)

            for var i = 0 ; i < (json.valueForKey("list") as! NSArray).count ; i++
            {
                arrDict.addObject((json.valueForKey("list") as! NSArray) .objectAtIndex(i))
            }
        }

    } catch {
        print(error)
    }

    self.weatherTableView.reloadData()
}

答案 1 :(得分:0)

您没有实例化tableView委托。请务必在self.weatherTableView.delegate = self内拨打viewDidLoad()

此外,每次加载数据时都应创建一个新的arrDict。 self.arrDict = []

如果上述调整不起作用,您应该花些时间调试它。确保第二个请求正在加载数据,如果是,则可能未调用self.weatherTableView.reloadData()。您可以尝试将其移至loadDataWeather()