2015-04-04 86 views
0

有誰知道我該如何解決這個問題?無法獲得變數

問題是prepareForSegue函數沒有得到chanceRain變量。由於某種原因chanceRain只在任務變量內有一個值。有人知道如何解決這個問題嗎?我試圖修復它在操場上,但我不能在其中導入SWXMLHash。

import UIKit 
import SWXMLHash 

class ViewController: UIViewController, UITableViewDelegate { 

    var cellContent = [""] 
    var indexOfTime = 0 
    var chanceRain = "" 
    var defaults = NSUserDefaults(suiteName: "group.com.royvano.paraplu") 
    var rainInt :Int = 0 



    @IBOutlet var cityInput: UITextField! 

    func enumerate(indexer: XMLIndexer) { 
     for child in indexer.children { 
      NSLog(child.element!.name) 
      enumerate(child) 
     } 
    } 


    @IBAction func button(sender: AnyObject) { 

     var url = NSURL(string: "http://api.worldweatheronline.com/free/v2/weather.ashx?key=ca89103dfe0a8b844a0a1e1249820&q=" + 
      cityInput.text.stringByReplacingOccurrencesOfString(" ", withString: "-") + "/" + cityInput.text.stringByReplacingOccurrencesOfString(" ", withString: "-") + "/" + "&num_of_days=2&tp=3&format=xml") 

     let task = NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in 

      var urlContent = NSString(data: data, encoding: NSUTF8StringEncoding) 

      println(url) 

      var xml = SWXMLHash.parse(urlContent!) 

      for elem in xml["data"]["weather"][0]["hourly"][self.indexOfTime]{ 

       self.chanceRain = (elem["chanceofrain"].element!.text!) 

       self.defaults?.setObject(self.chanceRain, forKey: "rainPercentage") 

       self.defaults?.synchronize() 


       self.performSegueWithIdentifier("btnSubmitSegue", sender: self) 

      } 

      println(self.chanceRain) 

     }) 
     task.resume() 

    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 



     if(segue.identifier == "btnSubmitSegue"){ 

      var svc: viewTwo = segue.destinationViewController as viewTwo 

      svc.datapassed = "There is " + self.chanceRain + "% chance of rain" //dit werkt, maar chanceRain niet..? 


     } } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     cellContent = ["01:00","04:00","07:00", "10:00", "13:00", "16:00", "19:00", "22:00"] 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     return cellContent.count 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     let cell = UITableViewCell(style: UITableViewCellStyle.Default , reuseIdentifier: "Cell") 

     cell.textLabel?.text = "\(cellContent[indexPath.row])" 

     return cell } 

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){ 

     indexOfTime = indexPath.row 



    } 



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



} 

另外,viewTwo類看過來:

import Foundation 
import UIKit 

class viewTwo: UIViewController { 

    @IBOutlet var label: UILabel! 

    var datapassed:String! = "" 

    override func viewDidLoad() { 

     label.text = datapassed } 

} 
+2

你能解決你的代碼格式嗎?目前很難閱讀 – Undo 2015-04-04 18:11:12

+0

@undo就這樣做了! – royvano 2015-04-04 18:18:09

+0

@royvano如果這就是你所說的格式正確,那麼我建議你開始把一些工作代碼示例(不是這一個......這一個不按預期工作),以[codereview.se] ...因爲那麼遠從格式化... – nhgrif 2015-04-04 18:56:44

回答

0

因爲你是觸發SEGUE上按下按鈕,除了IBAction爲button(_:),則chanceOfRain變量將不會被更新時,繼續發生。這是因爲chanceOfRain在異步調用的塊中更新,這意味着需要更新時間。在更新時,prepareForSegue可能已經解決。

要解決這個問題,請不要在故事板上的按鈕上按下繼續按鈕。相反,使用標識符從第一個ViewController到第二個ViewController進行定期輪播。在知道chanceOfRain已更新之後,您可以在異步呼叫的塊中調用performSegueWithIdentifier(_:sender:)。這將確保數據正確傳遞。