Как сохранить пользовательские данные в виде строки и загрузить эту строку в viewDidLoad - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь загрузить значение, которое было введено пользователем в viewDidLoad через строку. Я использую UserDefaults для сохранения значения пользователя, которое они вводят в UITextField (userValue), затем я сохраняю это в строке поиска. Я могу распечатать значение поиска в функции GoButton, и оно работает нормально, но когда я загружаю свой ViewController как новый, значение 'search' равно nil. Целью здесь является сохранение предыдущего поиска пользователей и его загрузка в UITextField (который используется в качестве поля поиска) после загрузки ViewController.

Код ниже:

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
}

Ответы [ 4 ]

0 голосов
/ 02 сентября 2018

Я всегда считал удобным и полезным хранить все свойства UserDefault как расширение в одном файле вместе с их получателями и установщиками. Гораздо проще поддерживать, использовать и читать. используя ключевое слово #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"
    }
0 голосов
/ 01 сентября 2018

очевидно, это обеспечивает ноль, потому что когда загрузка контроллера представления, поиск равен нулю, попробуйте это.

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)
    }
}
0 голосов
/ 01 сентября 2018

@ VishalSharma имеет правильную идею, но код, вероятно, должен выглядеть больше как ...

override func viewDidLoad() {
    super.viewDidLoad()

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

или даже проще ...

userValue.text = UserDefaults.standard.string(forKey: "hello")
0 голосов
/ 01 сентября 2018

При загрузке поиск фактически равен нулю.

Так что либо вы читаете userDefaults в viewDidload, либо проходите через переход: тогда вы можете загрузить поиск в процессе подготовки.

...