我是iOS编程的新手,所以我的问题可能并不复杂,但我仍然在努力寻找最佳解决方案。任何帮助将受到高度赞赏!
每次用户打开应用时,我都会尝试发送GET请求。我编写了函数loadMenu(),它从服务器上的json文件中收集数据,并在应用程序中填充表。
问题是,如果我更新json文件,它不会反映在应用程序中。如果感觉像loadMenu()部分代码被忽略了。
这是我的代码:
导入UIKit
class TableViewControllerNew:UITableViewController {
var names = [String]()
var mealDescription = [String]()
var price = [Double]()
override func viewDidLoad() {
super.viewDidLoad()
loadMenu()
}
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
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
var new = NSUserDefaults.standardUserDefaults().objectForKey("names") as! [String]
print("test: \(new.count)")
return new.count
}
func loadMenu() {
print("viewDidLoad works")
// Send HTTP GET
let myUrl = NSURL(string: "http://localhost/myPi/selection/wheyStationSelection.json");
let request = NSMutableURLRequest(URL:myUrl!);
request.HTTPMethod = "GET";
NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
dispatch_async(dispatch_get_main_queue()) {
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)
if let meals = json["meals"] as? [[String: AnyObject]] {
for meal in meals {
if let name = meal["name"] as? String {
self.names.append(name)
//NSUserDefaults.standardUserDefaults().setObject(self.names, forKey: "test1") as! [String]
//var new = NSUserDefaults.standardUserDefaults().objectForKey("test1") as? [String]
//print(new)
}
if let mealDescription = meal["mealDescription"] as? String {
self.mealDescription.append(mealDescription)
}
if let price = meal["price"] as? Double {
self.price.append(price)
}
}
}
} catch {
print("error serializing JSON: \(error)")
}
NSUserDefaults.standardUserDefaults().setObject(self.names, forKey: "test1") as! [String]
//print(self.names)
//print(self.mealDescription)
//print(self.price)
}
}).resume()
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cellIdenifier = "MealTableViewCell"
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdenifier, forIndexPath: indexPath) as! MealTableViewCell
var new = NSUserDefaults.standardUserDefaults().objectForKey("names") as! [String]
let name = new[indexPath.row]
//print(name)
cell.mealNameLabel.text = name
return cell
}
答案 0 :(得分:1)
@ david是对的,如果您将loadMenu()
方法放在viewDidAppear()
中,则每次出现视图时都会调用它。您可以详细了解UIViewController
here
另一件事。我不清楚您是否每次都调用loadMenu()
,或者您是否只是没有看到更新的内容。
我可以看到,在更新JSON时,您没有重新加载表视图。因此,您的TableView
不知道发生了任何更新,也不会再次呈现,您将看不到任何更新。
因此,就在这一行之后:
NSUserDefaults.standardUserDefaults().setObject(self.names, forKey: "test1")
你应该告诉你的tableView像这样重新加载:
tableView.reloadData()
所以你有:
NSUserDefaults.standardUserDefaults().setObject(self.names, forKey: "test1")
tableView.reloadData()
这应该会导致所有“渲染TableView”方法再次被调用,但这次使用新数据,您应该看到更新的内容。
希望这会对你有所帮助。
答案 1 :(得分:0)
如果您在loadMenu()
而不是viewDidAppear(animated:)
中致电viewDidLoad()
,则每次您离开应用并重新开启时都会调用它。