我在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!
}

最佳答案

您没有实例化tableView委托。确保在self.weatherTableView.delegate = self内部调用viewDidLoad()

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

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

10-08 05:54
查看更多