繁体   English   中英

UserDefaults不将数据保留在TextView中

[英]UserDefaults not persisting data in TextView

编辑:我注意到我正在使用不同的键(正在玩代码),但是即使它们相同,我也会得到相似的结果。

我到处都在StackOverflow,但没有找到解决方案。 我在情节提要中的第二个视图上有一个textview,我需要它来保持数据而无需按下任何按钮。 我应该去查看该视图,查看文本,并且当应用程序背景(或视图消失)时,它应该保留该数据。

我已经设法使文本显示在第二个视图上(通过segue),但是它不会随着通过循环添加的新文本而更新,并且不会持久化数据。 另外,如果我点击“清除”按钮以清除视图,则会清除文本视图,但是一旦我返回视图,数据就会返回。

本质上,它只保存了我的textview的一行,仅此而已。 任何帮助都将适用,因为我是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")
    }
}

我假设您已经测试并验证了appMovedToBackground的调用。

首先,正如注释中提到的那样,您需要使用相同的密钥。

然后,在您的保存代码中:

let myText = calcTape.text
UserDefaults.standard.set(myText, forKey: "savedStringKey")

myText具有String类型,因此应按原样存储它。

但是然后在您的加载代码中,您所做的事情确实很奇怪。 该行应该成功,并且userDataNew将具有您保存的字符串。

if let userDataNew:AnyObject = defaults.object(forKey: "userDataNew") as AnyObject?{

但是之后,您必须将其强制转换为Array 您的程序必须立即崩溃:

calcTape.text = (userDataNew as! Array).first

正确的加载方式应该是:

calcTape.text = UserDefaults.standard.string(forKey: "savedStringKey")

主题略有偏离,但您的代码有一些改进:代替此:

for eachNewLineInTape in tape {
   calcTape.text = calcTape.text + eachNewLineInTape + "\r\n"
}

你可以这样写:

calcTape.text = tape.joined(separator: "\r\n")

很抱歉回答我自己的问题(不确定如何做并弄清楚),但这是现在代码的样子:

import Foundation
import UIKit

class ViewControllerTwo: UIViewController {

var tape = Array<String>()

@IBOutlet weak var calcTape: UITextView!



override func viewDidLoad() {
    super.viewDidLoad()

    calcTape.text = tape.joined(separator: "\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 _:AnyObject = defaults.object(forKey: "savedStringKey") as AnyObject?{

        calcTape.text = UserDefaults.standard.string(forKey: "savedStringKey")

        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")
    print("saved in bg")
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM