【问题标题】:How to store user data as string, and load that string in viewDidLoad如何将用户数据存储为字符串,并在 viewDidLoad 中加载该字符串
【发布时间】:2018-09-01 18:36:44
【问题描述】:

我正在尝试通过字符串加载用户在 viewDidLoad 中输入的值。我正在使用 UserDefaults 将他们输入的用户值保存到 UITextField (userValue) 中,然后将其保存到字符串“搜索”中。我能够在 GoButton 函数中打印出 search 的值,并且工作正常,但是当我将 ViewController 加载为新的时,'search' 的值等于 nil。这里的目的是保存用户之前的搜索,并在加载 ViewController 时加载到 UITextField(用作搜索框)中。

代码如下:

class ViewController: UIViewController {

    @IBOutlet weak var userValue: UITextField!
    var search: String!
}

viewDidLoad:

override func viewDidLoad() {

    if (search != nil)
    {
        userValue.text! = String (search)
    }

}

按钮功能:

@IBAction func GoButton(_ sender: Any) {

    let userSearch: String = userValue.text!

    let perference = UserDefaults.standard
    perference.set(userSearch, forKey: "hello")
    perference.value(forKey: "hello")

    let value = perference.value(forKey: "hello") as! String

    search = value

    print (search) // <<this works, it prints out the users search value
}

【问题讨论】:

    标签: ios swift string userdefaults


    【解决方案1】:

    @VishalSharma 有正确的想法,但代码应该看起来更像……

    override func viewDidLoad() {
        super.viewDidLoad()
    
        if let search = UserDefaults.standard.string(forKey: "hello") {
           userValue.text = search
       }
    }
    

    或者更简单……

    userValue.text = UserDefaults.standard.string(forKey: "hello")
    

    【讨论】:

    • 完全同意你@Ashley
    • 或者更简单的 UserDefaults.standard.string(forKey: "hello")。请不要采用value(forKey之类的不良代码。完全没有理由将 KVC 方法与 UserDefaults 一起使用。
    • 天哪,我怎么会错过呢? ? 谢谢!答案已更新
    【解决方案2】:

    当您加载时,搜索实际上为零。

    因此,您要么在 viewDidload 中阅读 userDefaults,要么通过 segue:然后您可以在 prepare 中加载搜索。

    【讨论】:

      【解决方案3】:

      我一直发现将所有UserDefault 属性作为扩展名连同它们的getter 和setter 一起存储在同一个文件中是很方便和有用的。它更易于维护、使用和阅读。通过使用 #function 关键字作为您引用变量名称的键,而不是可以在代码中的其他地方意外更改的字符串。

      UserDefaults.swift

      import Foundation
      // An Extension to consolidate and manage user defaults. 
      extension UserDefaults {
          /// A value Indicating if the user has finished account setup.
          /// - Returns: Bool
          var finishedAcountSetup: Bool {
              get { return bool(forKey: #function) }
              set { set(newValue, forKey: #function) }
          }
      
          /// The hello text at the start of the application.
          /// - Returns: String?
          var helloText: String? {
              get { return string(forKey: #function) }
              set {set(newValue, forKey: #function) }
          }
      
         //etc...
      }
      

      当您使用这些值时请参考标准设置:

          //Setting
          UserDefaults.standard.helloText = "Updated Hello Text"
      
          // Getting
          // for non-optional value you can just get:
          let didCompleteSetup = UserDefaults.standard.finishedAcountSetup
      
          // Otherwise, safely unwrap the value with `if-let-else` so you can set a default value.
          if let text = UserDefaults.standard.helloText {
              // Ensure there is text to set, otherwise use the default
              label.text = text
          } else {
              // helloText is nil, set the default
              label.text = "Some Default Value"
          }
      

      【讨论】:

        【解决方案4】:

        显然,它提供 nil,因为当视图控制器加载时,搜索是 nil 试试这个。

        let perference = UserDefaults.standard
        
        override func viewDidLoad() {
            super.viewDidLoad()
            if (perference.value(forKey: "hello") != nil) {
                search = perference.value(forKey: "hello") as! String
                userValue.text! = String (search)
            }
        }
        

        【讨论】:

        • 在 Swift 中你应该使用 if let string = perference.value(forKey: "hello") as? String 而不是获取它两次
        • 当然可以,但是他已经将搜索变量声明为字符串,所以我只想使用它。
        猜你喜欢
        • 2018-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-06
        • 2020-07-05
        • 2021-09-13
        • 2022-07-26
        相关资源
        最近更新 更多