Редактировать: Я заметил, что я использую разные ключи (играл с кодом), но даже если они такие же, я получаю похожие результаты.UserDefaults не сохраняются в TextView
Я просмотрел StackOverflow, но не нашел решение для этого. У меня есть текстовое представление на втором представлении в моей раскадровке, и мне нужно, чтобы он сохранял данные без нажатия кнопки. Я должен перейти к представлению, увидеть текст и когда фоны приложения (или вид исчезнут), он должен сохранять эти данные.
У меня есть работа с точкой, когда текст появляется на втором представлении (через segue), но он не обновляется новым текстом, который добавляется через цикл и не сохраняет данные. Кроме того, если я нажимаю кнопку «Очистить», чтобы очистить представление, он очищает текст, но как только я вернусь к просмотру, данные вернутся.
По сути, он застрял в сохранении только одной строки моего текста и ничего больше. Любая помощь будет назначена, поскольку я очень новичок в Xcode. (Последний Xcode с Swift 3).
import Foundation
import UIKit
class CalcViewController: UIViewController {
var tape = Array<String>()
@IBOutlet weak var calcTape: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
for eachNewLineInTape in tape {
calcTape.text = calcTape.text + eachNewLineInTape + "\r\n"
}
let sel:Selector = #selector(self.appMovedToBackground)
let notificationCentre = NotificationCenter.default
notificationCentre.addObserver(self, selector: sel, name: NSNotification.Name.UIApplicationWillResignActive, object: nil)
let defaults = UserDefaults.standard
if let userDataNew:AnyObject = defaults.object(forKey: "userDataNew") as AnyObject?{
calcTape.text = (userDataNew as! Array).first
print("SAVED")
}
else {
print("not saved")
}
}
@IBAction func clearAll(_ sender: UIButton) {
// if the tape is not empty...
if (calcTape.text != ""){
// empty it (set to empty string)
calcTape.text = ""
let bundleIdentifier = Bundle.main.bundleIdentifier
UserDefaults.standard.removePersistentDomain(forName: bundleIdentifier!)
} else {
// otherwise, it was already empty, so display a message
let alert = UIAlertController(title: "Alert", message: "Nothing to clear", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated: true, completion: nil)
}
}
func appMovedToBackground(){
print("App moved to background")
let myText = calcTape.text
UserDefaults.standard.set(myText, forKey: "savedStringKey")
UserDefaults.standard.synchronize()
print("saved")
}
}
Это помогло бы много, если вы использовали один и тот же ключ для сохранение и загрузка данных в/из пользовательских значений по умолчанию. Еще лучше объявить константу и использовать ее в обоих местах. – rmaddy
Вы используете два разных ключа; 'userDataNew' и' savedStringKey'. Один из них сохраняет массив, а другой имеет строку. И пользовательские значения по умолчанию не предназначены для хранения данных. Да, узнайте, как использовать пользовательские настройки по умолчанию. Нет, не узнайте, как использовать его в качестве хранилища данных. Используйте plists или Core Data или Realm или ... – Paulw11
@rmaddy, даже если они такие же, я получаю аналогичные результаты. –