ИТАК, потому что вы сказали, что вы хотите, чтобы сохраняться данные более запусков приложений вам понадобятся значения по умолчанию для хранения ваших товаров. Поскольку Дэн уже предположил, что вы в основном делаете это правильно. Вы просто хотите установить переменную, которая ранее не была объявлена. Но я покажу вам это в следующем коде. Я также приложу второй подход, в котором элементы передаются следующему контроллеру представления во время выполнения segue.
Первый пример: представьте, что у нас есть два контроллера вида, например, в вашем примере. Первый контроллер представления содержит UITextField для ввода пользовательского текста. Всякий раз, когда мы переключаемся с первого контроллера представления на второй контроллер представления с помощью раскладки раскадровки (например, при нажатии кнопки), мы берем существующие тексты из предыдущих секций из пользовательских настроек по умолчанию и добавляем текущий пользовательский ввод, а затем сохраняем его обратно к пользовательским настройкам по умолчанию. Это происходит в первом контроллере представления:
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
if segue.identifier == "toSecondViewController" {
let itemsFromDefaults = UserDefaults.standard.object(forKey: "items")
var items: [String]
if let tempItems = itemsFromDefaults as? [String]
{
items = tempItems
items.append(textField.text!)
}
else
{
items = [textField.text!]
}
print(items)
UserDefaults.standard.set(items, forKey: "items")
}
}
}
Это первый контроллер вид выглядит очень похож на код, но я хотел бы добавить для полноты картины.
Затем во втором контроллере представления мы просто захватываем элементы из пользовательских значений по умолчанию и храним их непосредственно в переменной экземпляра этого контроллера вида. С помощью этого мы можем делать то, что хотим в других методах в контроллере представления, и обрабатывать элементы дальше. Как я уже говорил, что вы пропали без вести был экземпляр объявления переменной для хранения элементов в
class ViewController2: UIViewController {
private var items: [String]? // This is only accessible privately
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.items = UserDefaults.standard.object(forKey: "items") as? [String]
}
}
Второй пример:. Вы можете также объявить внутреннюю открытую переменную/в ViewController2, так что вы можете установить его прямо с первого взгляда контроллер в исполнении segue. Чем вам не нужно будет захватывать элементы из пользовательских настроек по умолчанию в ViewController2. Для этого вы можете получить доступ к контроллеру представления места назначения segue, а затем перенести его в ViewController2 и непосредственно установить его элементы.
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
if segue.identifier == "toSecondViewController" {
let itemsFromDefaults = UserDefaults.standard.object(forKey: "items")
var items: [String]
// [...] Do the stuff to get the items and add current input like before [...]
let destinationViewController = segue.destination as! ViewController2
destinationViewController.items = items
}
}
}
class ViewController2: UIViewController {
var items: [String]? // This is accessible from outside now
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print(items) // We can now print this because it is set in prepareForSegue
}
}
Я действительно надеюсь, что смогу помочь вам в этом и объяснил это понятным. Не стесняйтесь оставлять комментарий, если у вас есть какие-либо вопросы.
Какова ваша проблема? (Также вы пропустили закрывающий кронштейн в viewDidAppear) –
Извините, я хочу очень ясно.По-видимому, есть «Использование нерешенных элементов идентификатора». –
Я думаю, вам просто нужно создать экземпляр userdefaults.standard, когда вы делаете что-то с ним. Например, UserDefaults.standard(). Set (и т. Д. –