2015-06-26 54 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

相关问题