我目前正在Swift编写天气应用程序。当我从一个视图控制器移动到另一个视图控制器时,每个视图控制器的内容(例如我的文本字段条目)将重置回其原始状态。我看到有人遇到同样的问题here on StackOverflow,但他们使用的是Objective-C。有关如何在Swift 2中执行此操作的任何指示?
修改
我已尝试以下方法加载它:
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 :(得分:0)
导航控制器与模型无关。
模型(M)保存您的应用程序的数据,然后将其显示在属于视图控制器(C)的视图(V)中。此设计模式称为MVC,您在问题中解释了here和here。
会出现视图控制器吗?控制器从模型中检索数据并更新视图的字段。
查看控制器会消失吗?如果用户更改了任何数据,控制器将使用视图更改字段中的数据更新模型。
有些人可能会建议全局变量,以使数据可供所有视图控制器使用。这将是一个简单的出路,但你不会为自己做任何好事。
有些人可能会建议单身人士。它有一些优点和一些缺点。
Apple建议核心数据。这是一种保存(保存)应用程序对象图的方法。陡峭的学习曲线,有些人可能会说它有点矫枉过正,但随着你编写越来越复杂的应用程序,你会逐渐欣赏它。
您可以将数据存储在根视图控制器中,并使用(展开)segue和依赖注入来来回传递信息。
在您的应用终止之前,您需要保存模型,用户首选项以及所需的任何其他必要详细信息,例如状态恢复。
iCloud或其他云存储。如果您想在多个设备之间同步或共享信息,则非常有用。
NSUserDefaults的
核心数据
文件系统
你真的应该决定你希望你的应用程序存储和保存数据的方式,而不仅仅是要求(Swift)代码。还有其他选择,但您可以自行选择设计模式。然后尝试实现它。如果你搞清楚,那真是太棒了!如果您遇到困难,请使用最少的代码编辑您的问题,以显示您尝试的内容,然后人们就可以给您一个特定的答案。
简而言之,如果您希望代码显示如何执行某些操作,那么您应该提供显示您尝试过的代码。
<强>更新强>
当您的应用终止时,会使用 NSUserDefaults
。你不应该用它来传递&#34;从一个视图控制器到另一个视图控制器的数据,或者在您的应用仍处于活动状态时跟踪数据。
您的天气数据属于模型。
您的视图控制器以某种方式访问模型以获取其数据。例如,一个视图控制器可能需要获取某个位置的当前天气。
因此,例如,如果您决定使用单身人士,则可能有以下方法:
WeatherManager.sharedManager.weatherForLocation(latitude: ..., longitude: ...)
或者,如果您决定将当前天气传递给您正在显示的视图控制器,您可以在segue中进行:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showWeather" {
if let destination = segue.destinationViewController as? WeatherViewController {
destination.dewPoint = currentDewPoint
}
}
}
我所了解的是,您必须区分数据所在的位置以及数据的访问或共享方式。
您需要提出类似的问题,&#34; WeatherViewController应该负责保存天气(下次打开时)吗?&#34;可能不是!它应该显示天气,但它不应该负责保存天气。当它出现时,要么是天气,要么从模型中检索天气。
您需要了解并限制每个视图控制器的范围或责任。这是封装。当您理解这一点时,您会发现它不是 一个视图控制器要求另一个视图控制器检索天气预报的好方法。从视图控制器中获取该责任。设置一个知道如何从服务器获取数据的客户端。
现在您有一个负责与服务器通信的客户端,一个保存当前天气数据的模型,一个显示天气的视图控制器,以及可能用于列表位置的其他视图控制器,以及对于偏好。
如果你没有掌握这一点,那么你的应用程序很可能会成为从一切到其他一切的连接的混乱。
您将通过学习了解更多内容 - 观看一些视频,向您介绍软件设计模式 - 然后在您掌握事物应如何运作之前尝试做。如果你一开始没有正确地学习如何做事,那么你会发现许多糟糕的编程习惯,最终会使用别人给你的代码,而不会真正了解其后果。