2015-06-26 83 views
0

在我的模型中,我構建了一個API類,它爲基本API調用創建函數http://openweathermap.org/api,該函數以JSON輸出作爲字典返回閉包。跨ViewControllers設置和訪問全局屬性的正確方法是什麼?

然後我在我的第一個ViewController中調用這個函數,當我運行println()時,它成功地將輸出作爲字符串返回。

我遇到的問題是如何將此輸出(所有基本字符串類型)存儲爲全局可訪問的變量,然後我可以通過Segue傳遞給自定義的SearchResultViewController視圖。

我目前不工作的方法試圖在我的FirstViewController開始處設置一個空字符串,可選地將輸出打包爲一個字符串,存儲在cityName變量中,然後作爲Segue的一部分通過覆蓋來傳遞prepareForSegue函數。

然後我會在我的SearchResultViewController中創建相應的屬性cityName。

我已經徹底檢查了命名約定/鏈接到自定義ViewController類,並且想確認是否缺少這種方法中的關鍵步驟。

下面詳細代碼。

FirstViewController:

var cityName = "" 

@IBAction func searchButton() { 
    let api = API() 
    api.weatherSearch(urlSearch: searchField.text!) { dictionary in 
     println(dictionary) 
     if var cityName = dictionary["name"] as? String { 
       println(cityName) 
     } 
    } 
    self.performSegueWithIdentifier("Search", sender: nil) 
} 

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { 
    if(segue.identifier == "Search") { 
     var SearchResult = segue!.destinationViewController as SearchResultViewController; 
     SearchResult.cityName = cityName 
    } 
} 

SearchResultViewController:

class SearchResultViewController: UIViewController { 

    var cityName: String! 

    @IBOutlet weak var Picture: UILabel! 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    println(cityName) 
    } 
} 

回答

1

更改searchButton()

@IBAction func searchButton() { 
    let api = API() 
    api.weatherSearch(urlSearch: searchField.text!) { dictionary in 
     println(dictionary) 
     if var cityName = dictionary["name"] as? String { 
      println(cityName) 
      self.performSegueWithIdentifier("Search", sender: nil) 
     } 
    } 
} 

如果這工作那麼你的方法是行不通的原因是網絡請求通常是異步

+0

感謝您的建議,概念上它是有道理的 - 不幸的是,當我跑這個時,我得到了以下新錯誤 - 「由於未捕獲的異常'NSInternalInconsistencyException'終止應用程序」。我認爲這發生在SearchResultViewController中的println(cityName)時。 另外,讚賞它是一個廣泛的問題,在這種情況下處理異步性的最佳實踐是什麼?你能指出一些好的資源嗎? – AlexHandy1

0

有一些邏輯不匹配,在這裏,首先你不必分配的cityName在ViewController中一個空字符串,你可以把它的可選字符串。請使用if let而不是if var來檢查它。

var cityName:String? 

@IBAction func searchButton() { 
    let api = API() 
    api.weatherSearch(urlSearch: searchField.text!) { dictionary in 
     println(dictionary) 
     if let value = dictionary["name"] as? String { 
      self.cityName = value 
     } 
    } 
    self.performSegueWithIdentifier("Search", sender: self) 
} 

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

    if(segue.identifier == "Search") { 
     var SearchResult = segue!.destinationViewController as SearchResultViewController; 
     SearchResult.cityName = cityName 
    } 
} 
+0

感謝的建議 - 這是有道理的,一些我錯過的邏輯是在實際存儲可選值的自我屬性中。 不幸的是,我現在只是在我的SearchResultViewController中println(cityName)時得到'零'。這實際上在println(字典)輸出之上的調試器中輸出,這會向我暗示,問題仍然與上面的建議一樣具有不同步性。另外爲什麼你需要在performSegueWithIdentifier的'nil'中將發送者改爲'self'? – AlexHandy1

相關問題