首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使变量在切换到不同视图控制器时不重置,并将变量保持在应用程序退出时的状态。

使变量在切换到不同视图控制器时不重置,并将变量保持在应用程序退出时的状态。
EN

Stack Overflow用户
提问于 2019-06-13 21:22:37
回答 2查看 192关注 0票数 0

我正在制作一个天气应用程序,目前我正在添加支持从帝国度量切换到米制,但是当你从设置视图控制器切换到主菜单到天气查看器时,它会将单元变量重置为帝国。

我看过许多问题和文章,或者:

  1. 我不知道怎么做
  2. 它不起作用,也不需要更老版本的Swift
  3. 它会导致整个应用程序崩溃

========================================================================

注意:我正在使用segue来切换VCs。

代码语言:javascript
复制
@IBAction func unitSwitcherMetric(_ sender: UIButton) {

    weatherDataModel.unit = "metric"
    weatherDataModel.windUnit = ""
    print("The unit is now \(weatherDataModel.unit)")

}

选择该按钮后,它会按预期的方式打印The unit is now metric,但是当切换到主菜单视图控制器(它应该打印单元变量)时,它会打印imperial,API也会提供帝国度量。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-13 21:40:44

您可以实现Singleton,它是一个只有一个实例的类,用于不同用途的内存中。您可以这样实现它:

代码语言:javascript
复制
class MetricManager {

    static let sharedInstance = MetricManager()

    var currentUnit: String = "imperial"

    private init() {

    }
}

之后,您可以简单地在Settings上分配一个值,如下所示

代码语言:javascript
复制
@IBAction func unitSwitcherMetric(_ sender: UIButton) {
    MetricManager.sharedInstance.currentUnit = "metric"
}

然后在菜单上或者任何你想得到当前单位值的地方,你只需参考它:

代码语言:javascript
复制
MetricManager.sharedInstance.currentUnit
票数 1
EN

Stack Overflow用户

发布于 2019-06-14 04:45:02

有几个想法:

  1. 我不建议使用字符串值。如果我需要在10之前支持iOS版本,我会定义一个枚举: 枚举CustomUnitTemperature: String { case摄氏度case fahrenheit }
  2. 为了保存这个“首选温度单位”,以便下次运行应用程序时可以使用它,您可以在UserDefaults中保存用户的首选项,例如: 结构参数{ temperatureUnitKey = "customTemperatureUnitKey“var unitTemperature: CustomUnitTemperature { didSet {didSet{ forKey: temperatureUnitKey) } init() { unitTemperature = UserDefaults.standard.string(forKey: temperatureUnitKey) .flatMap { CustomUnitTemperature(rawValue:$0) } ??.celsius } 然后您可以有一个preferences对象: var preferences = Preferences() 然后,您可以像这样将unitTemperature读写到首选项(这将在应用程序运行期间保持不变)。例如阅读: 设单元= preferences.unitTemperature开关单元{ case .celsius:.案例.fahrenheit:.} 或者,更改/保存值: preferences.unitTemperature = .fahrenheit 说到底,它是一个属性,它是通过从UserDefaults读取并在设置属性时在UserDefaults中更新而初始化的。
  3. 如果您不需要在10之前支持iOS版本,而不是定义我自己的温度度量单位,我将使用现有的UnitTemperature类型。有关如何使用此文档类型的信息,请参阅文档或WWDC 2016视频测量和单位。 无论如何,在iOS 10和更高版本中,我可能会定义我的Preferences类型来使用这个UnitTemperature类型访问和保存,但是将symbol保存到UserDefaults: 结构参数{ temperatureUnitKey = "temperatureUnitKey“var unitTemperature: UnitTemperature { didSet {didSet{ forKey: temperatureUnitKey) } init() { unitTemperature = UserDefaults.standard.string(forKey: temperatureUnitKey) .map {UnitTemperature(符号:0)} ??.celsius } 然后您可以以同样的方式访问它(尽管我们的switch现在需要一个default子句,因为celsiusfahrenheit不是唯一可接受的值: 设单元= preferences.unitTemperature开关单元{ case .celsius:.案例.fahrenheit:..。默认值:.} 更新首选项是相同的: preferences.unitTemperature = .fahrenheit
  4. 在将数据从呈现视图控制器传递到呈现视图控制器方面,请参见视图控制器之间的数据传递
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56588736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档