【问题标题】:Updating UserDefaults after setting设置后更新 UserDefaults
【发布时间】:2020-08-23 14:02:40
【问题描述】:

我在这里定义我的 UserDefaults 值。下次启动时,我的应用程序会打开正确的窗口。但我也想在设置后立即更新 UserDefaults。这样我现在就可以使用它们了。

let defaults = UserDefaults.standard
  @IBAction func pressed(_ sender: UIButton) {
        switch team {
        case "bayernMunchen":
        defaults.set(46, forKey: "MannschaftsAuswahl")
        UserDefaults.standard.synchronize()
        case "borussiaDortmund":
        defaults.set(41, forKey: "MannschaftsAuswahl")
        UserDefaults.standard.synchronize()
        case "schalke":
        defaults.set(45, forKey: "MannschaftsAuswahl") 
        UserDefaults.standard.synchronize()
        default: print(8)
        }
        let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
        let nextViewController = storyBoard.instantiateViewController(withIdentifier: "WeatherViewController") as! WeatherViewController
        self.present(nextViewController, animated:true, completion:nil)
    }

我上面的代码打开了另一个窗口,我尝试用这个来获取值:

let defaults = UserDefaults.standard
var cityName = defaults.integer(forKey: "MannschaftsAuswahl")
print(cityName)

但它没有显示更新的值。正如我所说,我需要关闭并打开应用程序。 设置后如何更新 UserDefaults?

【问题讨论】:

  • 有一个synchronize 函数用于UserDefaults
  • 您的代码没问题,所以肯定还有更多您没有告诉我们的事情发生。但不要使用 UserDefaults 将值传递给下一个视图控制器。将值本身直接传递给新的视图控制器。
  • 我必须纠正自己。同步不起作用。我就是这么想的。我不知道我做错了什么。我更新了上面的代码。
  • matt 我不知道如何为函数中的变量设置值。我读到这不起作用。
  • koropok 谢谢你,但没用。

标签: swift swift5


【解决方案1】:

如何在设置 UserDefaults 后更新它们?

如果你想重置 UserDefaults 那么:

UserDefaults.standard.removeObject(forKey: "MannschaftsAuswahl")

据我了解,您正在尝试将基于团队的 Int 值存储在一个视图控制器中,并在您可以执行 segue 的另一个视图控制器中访问该 Int 值。您可以执行以下操作: 假设您有 2 个视图控制器 (MainVC),其中有图像并创建订单按钮和 (WeatherViewController),当单击“按下”按钮时将显示。因此,您希望在 WeatherViewController 中访问 MainVC 中的团队数据,然后您可以执行以下操作:

在 MainVC 中:

class MainVC : UIViewController {
   var teamData : Int = 0
   ....
   @IBAction func pressed(_ sender: UIButton) {
      switch team {
         case "bayernMunchen":
           self.teamData = 46
         case "borussiaDortmund":
           self.teamData = 41
         case "schalke":
           self.teamData = 45
         default: print(8)
      }
      self.performSegue(withIdentifier: "showWeatherViewController", sender: self)
   }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.destination is WeatherViewController
        {
            let vc = segue.destination as? WeatherViewController
            vc?.mannschaftsAuswahl = teamData
        }
    }
}

在 WeatherViewController.swift 中,您必须如下声明 imageDataArray,当您执行从 MainVC 到 WeatherViewController 的 segue 时,此 imageDataArray 现在将包含 MainVC 的所有 imageData 数组内容,您可以访问这些内容:

 class SecondVC : UIViewController {
     var mannschaftsAuswahl : Int
     ...
     func printCityName() {
         print(mannschaftsAuswahl)
     }
 }

更新: 即使你使用 UINavigationController 你也可以使用 segue。从要在情节提要中单击的按钮向 WeatherManager ViewController 添加类型“显示(例如推送)”的类型,并添加标识符 showWeatherViewController 上述代码将按预期工作。

【讨论】:

  • 嘿,谢谢。是的,这就是我想要的。但我不使用segues。我使用 UINavigationController 并使用此代码通过单击按钮切换到下一个屏幕: let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil) let nextViewController = storyBoard.instantiateViewController(withIdentifier: "WeatherViewController") as! WeatherViewController self.present(nextViewController, animated:true, completion:nil) 但是我在另一个 swift 文件中使用的 Int。 Swift 文件名为 WeatherManager.swift
  • 即使你使用 UINavigationController 你也可以使用 segue。从您要在情节提要中单击的按钮向 WeatherManager ViewController 添加类型“显示(例如推送)”的类型,并添加标识符 showWeatherViewController 上述代码将按预期工作。
  • 这导致我遇到另一个问题。我只能在 segue 上附加一个视图。但现在我有 2 个窗口附加到该视图的 if else 语句。
  • 您也可以从视图控制器附加segue,而不仅仅是视图。我不明白你所说的附加 2 个窗口是什么意思,你的意思是 2 个 segue ?如果是这样,那么您可以通过它们的标识符来区分它们(确保每个 segue 的标识符是唯一的),并且您可以再包含一个 else if 语句来调用这个 segue “showWeatherViewController”
猜你喜欢
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 2013-01-17
相关资源
最近更新 更多