2016-01-23 50 views
0

我目前正在Swift中编写一个天气应用程序。当我从一个视图控制器移动到另一个视图控制器时,每个视图控制器的内容(例如我的文本框条目)都会重置为原始状态。我看到有人遇到同样的问题here on StackOverflow,但他们使用Objective-C。任何关于如何在Swift 2中做到这一点的指针?故事板和保留每个控制器中的数据(Swift)

编辑:

我已经尝试了以下加载它:

let defaults = NSUserDefaults.standardUserDefaults() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let savedDewPoint = defaults.integerForKey("savedDewPoint") 
    dewPointLabel?.text = "\(savedDewPoint)º" 

    loadUserSettings() 
    retrieveMoreInformation() // The refresh function for this view controller. 
} 

而且,这里是我来存储它的代码:

override func viewDidAppear(animated: Bool) { 
    let savedDewPoint = defaults.integerForKey("savedDewPoint") 
    defaults.setObject(dewPointLabel?.text, forKey: "savedDewPoint") 
} 

它存储,但它没有得到值并显示它。我尝试过注释掉retrieveMoreInformation(),试图停止首先从互联网上获取天气信息,并试图加载存储的信息。

我也尝试使用viewWillDisappear尝试存储它,并且这也没有做任何事。

+0

您设计的哪个部分负责(提供或)保存视图控制器的内容? – 2016-01-23 18:08:07

+0

你有代码viewWillAppear或viewDidAppear哪些设置文本字段? – Russell

+0

@PetahChristian没有 - 这就是问题所在,我需要弄清楚如何实现它。 – Insleep

回答

0

导航控制器与模型无关。

模型(M)保存您的应用程序的数据,然后显示在属于视图控制器(C)的视图(V)中。这种设计模式被称为MVC,在您发现的问题herehere中进行了解释。

  • 视图控制器会出现吗?控制器从模型中检索数据并更新视图的字段。

  • 视图控制器会消失吗?如果用户更改了任何数据,则控制器将使用视图更改字段中的数据更新模型。

如何存储您的(模型)数据?

  • 有些人可能会建议全局变量,使数据可用于所有视图控制器。这将是简单的出路,但你不会做任何好处。

  • 有些人可能会建议一个单身人士。它有一些优点和一些缺点。

  • 苹果建议核心数据。这是一种持久(保存)应用对象图的方式。陡峭的学习曲线,有些人可能会说这是过度的,但随着您编写越来越复杂的应用程序,您将越来越喜欢它。

  • 您可以将数据存储在根视图控制器中,并使用(展开)segues和依赖注入来回传递信息。

哪里可以保存您的(模型)数据?

在您的应用程序终止之前,您需要保存模型,用户首选项以及任何其他必需的详细信息,例如状态恢复。

  • iCloud或其他云存储。如果您想在多台设备之间同步或共享信息,这很有用。

  • NSUserDefaults的

  • 核心数据

  • 文件系统

你真的应该决定如何您希望您的应用程序存储和保存其数据,而不是仅仅要求(斯威夫特)代码。还有其他选择,但是您可以选择设计模式。然后尝试实施它。如果你弄明白了,那太棒了!如果您遇到困难,请使用最少的代码来编辑您的问题,以显示您尝试的内容,然后人们可以为您提供特定的答案。

总之,如果你想要代码展示你如何做某事,那么你应该提供代码来显示你所尝试的。

更新:

NSUserDefaults,当你的应用程序终止使用。您不应该使用它来将数据从一个视图控制器“传递”到另一个视图控制器,或者在应用程序仍处于活动状态时跟踪数据。

您的天气数据属于模型。

您的视图控制器以某种方式访问​​模型以获取其数据。例如,一个视图控制器可能需要获取某个位置的当前天气。

因此,举例来说,如果你决定使用一个单身,你可能有一个方法,如:

WeatherManager.sharedManager.weatherForLocation(latitude: ..., longitude: ...) 

,或者,如果你决定当前的天气传递给视图控制器你会显示,你可以做一个赛格瑞:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "showWeather" { 
     if let destination = segue.destinationViewController as? WeatherViewController { 
      destination.dewPoint = currentDewPoint 
     } 
    } 
} 

什么,我得到的是,你有你的地方居住的数据来区分,以及如何将数据访问或共享。

您需要提问这样的问题:“WeatherViewController是否应负责保存天气(下次打开时)?”可能不会!它应该显示天气,但它不应该负责保存天气。当它出现时,它要么已经交给天气,要么从模型中检索天气。

您需要了解并限制每个视图控制器的范围或责任。这是封装。当你理解这一点时,你意识到它是而不是一个视图控制器要求另一个视图控制器检索天气预报的好方法。从视图控制器中获取该责任。设置知道如何从服务器获取数据的客户端。

现在你已经有一个客户端,负责与服务器进行通信,一个保存当前位置天气数据的模型,一个显示天气的视图控制器,以及可能位置列表的其他视图控制器,以及优先。

如果你没有得到解决这个问题,你的应用程序很可能是从一切到其他任何东西的连接纠结的咆哮。

您将通过学习了解更多 - 观看一些视频,这些视频会向您介绍软件设计模式 - 然后在处理应该如何工作之前尝试去做。如果你一开始没有正确地学习如何做事,你就会遇到很多不好的编程习惯,最终会使用某人给你的代码而不真正理解分支。

+0

看我上面的编辑。 – Insleep

+0

@Insleep'ViewController()。retrieveWeatherForecast()'初始化与您的主视图控制器实例不同的新视图控制器实例。当视图出现时试图存储价值的原因是什么? – 2016-01-24 18:18:55

+0

我想在视图出现时存储该值,以便下次打开视图时显示该值。但现在我想起来了,“viewWillDisappear”会更有意义,但是这也行不通。我也删除了'ViewController()。retrieveWeatherForecast',因为我意识到这是没有必要的,因为当视图控制器被加载时它自己检索天气预报。 – Insleep

相关问题