故事板和保留每个控制器中的数据(Swift)

时间:2016-01-23 17:51:18

标签: ios iphone swift uiviewcontroller storyboard

我目前正在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来尝试存储它,但这也没有做任何事情。

1 个答案:

答案 0 :(得分:0)

导航控制器与模型无关。

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

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

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

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

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

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

  • 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;可能不是!它应该显示天气,但它不应该负责保存天气。当它出现时,要么是天气,要么从模型中检索天气。

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

现在您有一个负责与服务器通信的客户端,一个保存当前天气数据的模型,一个显示天气的视图控制器,以及可能用于列表位置的其他视图控制器,以及对于偏好。

如果你没有掌握这一点,那么你的应用程序很可能会成为从一切到其他一切的连接的混乱。

您将通过学习了解更多内容 - 观看一些视频,向您介绍软件设计模式 - 然后在您掌握事物应如何运作之前尝试做。如果你一开始没有正确地学习如何做事,那么你会发现许多糟糕的编程习惯,最终会使用别人给你的代码,而不会真正了解其后果。