如何将两个 UITextView 中的数据保存到 UserDefaults

Posted

技术标签:

【中文标题】如何将两个 UITextView 中的数据保存到 UserDefaults【英文标题】:How to save data from two UITextViews to UserDefaults 【发布时间】:2019-11-06 05:51:06 【问题描述】:

对于每个使用UserDefaultsUITextView,我都创建了一个保存函数和一个显示函数。

无论添加什么text都需要在添加时显示,保存后再打开应用时再次显示。

如果我安装的应用程序只有保存功能,请退出应用程序并添加要显示的功能,然后重新安装而不删除已安装的应用程序,一切正常。

如果我安装添加了这两个功能的应用程序,它就不起作用。

必须有一个简单的解决方案,我显然做错了什么。

来自textView 的数据用于计算结果,然后显示在另一个textView 上。 所有数据都是用其他功能添加的,用户没有。

    numberHistoryView.isEditable = false
    numberHistoryView.isSelectable = false

func saveHistoryTextView()

    let defaults = UserDefaults.standard
    let numberHistory = numberHistoryView.text
    defaults.set(numberHistory, forKey: "combos")

func displaySavedHistory()

    let defaults = UserDefaults.standard
    let savedCombos = defaults.object(forKey: "combos") as? String ?? ""
    numberHistoryView.text = savedCombos


func saveFrequencyTextView()

    let defaults = UserDefaults.standard
    let numberFrequency = numberFrequencyCount.text
    defaults.set(numberFrequency, forKey: "frequency")

func displaySavedFrequency()

    let defaults = UserDefaults.standard
    let savedFrequency = defaults.object(forKey: "frequency") as? String ?? ""
    numberFrequencyCount.text = savedFrequency



override func viewWillDisappear(_ animated: Bool)

    saveHistoryTextView()
    saveFrequencyTextView()

override func viewWillAppear(_ animated: Bool)

    displaySavedHistory()
    displaySavedFrequency()

【问题讨论】:

不相关但 UserDefaults 中有 string(forKey: @Superlative 请检查简单的解决方案:***.com/a/58724094/6197968 您说“我安装的应用程序添加了两个功能它不起作用”您所说的不起作用是什么意思?它不会给出任何价值还是给出旧值? textView 中没有显示任何内容 全新安装后或第二次将值保存到 UserDefault 后不会显示? 【参考方案1】:

这取决于您调用savedisplay 方法的顺序和时间

    当您安装新的应用程序时,UserDefaults 中不会保存任何数据。因此,当您在 viewWillAppear(_:) 中调用 displaySavedHistory()displaySavedFrequency() 方法时,将不会获取任何内容,因为尚未保存任何内容。

    现在,当您使用viewWillDisappear(_:) 中的saveHistoryTextView()saveFrequencyTextView() 方法保存数据,然后您杀死并再次运行应用程序时,将获取并显示保存的数据。

另外,由于您将数据保存在UserDefaults 中,而UserDefaults 保存在sandbox 中,因此当您删除应用程序时数据不会保留。如果您想在删除应用后仍保留数据,则必须将数据保存在 iCloudkeychain 等中。

【讨论】:

当显示方法存在时,保存的数据不会被获取和显示。需要删除显示方法,然后在没有它们的情况下重新启动应用程序。然后需要再次添加它们,然后当应用再次启动时一切正常。【参考方案2】:

一旦我以正确的频率将大脑置于 theta 状态,我就设法弄清楚了。

感谢@Naresh 和所有其他贡献者的帮助,因为您可能对我提供了一点帮助。

解决方案基本上只需要一个简单的 if 语句。

现在一切正常。

func saveHistoryTextView()

    if numberHistoryView.text?.count != nil
    
        let defaults = UserDefaults.standard
        defaults.set(numberHistoryView.text!, forKey: "combos")
    

func displaySavedHistory()

    let defaults = UserDefaults.standard
    if let savedCombos = defaults.string(forKey: "combos")
    
        numberHistoryView.text = savedCombos
    


func saveFrequencyTextView()

    if numberFrequencyCount.text?.count != nil
    
        let defaults = UserDefaults.standard
        defaults.set(numberFrequencyCount.text!, forKey: "frequency")
    

func displaySavedFrequency()

    let defaults = UserDefaults.standard
    if let savedFrequency = defaults.string(forKey: "frequency")
    
        numberFrequencyCount.text = savedFrequency
    
  



override func viewWillDisappear(_ animated: Bool)

    saveHistoryTextView()
    saveFrequencyTextView()

override func viewWillAppear(_ animated: Bool)

    displaySavedHistory()
    displaySavedFrequency()

【讨论】:

【参考方案3】:

您可以使用属性观察器来做到这一点:

private let DATA_KEY = "Saved Data"

//After initialising the outlet we can set the data
@IBOutlet weak var textView: UITextView! 
    didSet 
        textView.text = self.data
    


private var data: String 
    set 
        //Save data in user defaults
        UserDefaults.standard.set("The value you will assign", forKey: DATA_KEY)
    
    get 
        //get the data from user defaults.
        return UserDefaults.standard.value(forKey: DATA_KEY) as? String ?? ""
    


//UITextViewDelegate: set the text data on end of UITextView editing
func textViewDidEndEditing(_ textView: UITextView) 
    self.data = textView.text

【讨论】:

无法让它工作,它一直以这种方式崩溃。也感谢降价:)

以上是关于如何将两个 UITextView 中的数据保存到 UserDefaults的主要内容,如果未能解决你的问题,请参考以下文章

将 UITextView 中的文本保存到 NSUserDefaults 中的方式与将 UITextFIeld 保存在 Notes 应用程序中的方式相同

如何将菜单选项添加到 NSTextAttachment 弹出菜单是 UITextView?

将文本从 UITextView 保存到领域(Swift 5)时出现问题

UITextView 保存数据

如何将 UITableViewCell 中的 UITextView 滚动到键盘顶部?

将 UITextView 内容保存在 NSString 中