如何在没有按钮操作的情况下使用 userdefualts 保存文本字段(swift3)

Posted

技术标签:

【中文标题】如何在没有按钮操作的情况下使用 userdefualts 保存文本字段(swift3)【英文标题】:How to use userdefualts to save a textfield without a button action (swift3) 【发布时间】:2017-03-15 00:53:50 【问题描述】:

我想使用 userdefulats,这样当用户从视图控制器 a 转到 b 再回到 a 时,文本仍然存在。但是,我想在不让用户点击按钮来保存 textview 文本的情况下执行此操作。

import UIKit

 class ViewController: UIViewController 



override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


override func viewWillDisappear(_ animated: Bool) 

    optional func textViewDidChange(_ textView: UITextView)



【问题讨论】:

textViewDidChange 不属于 viewWillDisappear。 @J.ren 的回答展示了如何做到这一点 【参考方案1】:

试试这个:

import UIKit
import Foundation

class ViewControllerA: UIViewController, UITextViewDelegate 

var textView: UITextView?
let textKey = "textKey"

//When view will appear, we should read text we have stored, then display text in textview
override func viewWillAppear(_ animated: Bool) 
    //We may get nil from UserDefaults
    let storedText = UserDefaults.standard.object(forKey: textKey) as? String ?? ""
    self.textView?.text = storedText


override func viewWillDisappear(_ animated: Bool) 
    UserDefaults.standard.setValue(self.textView?.text, forKey: textKey)
    UserDefaults.standard.synchronize()


override func viewDidLoad() 
    super.viewDidLoad()
    //Do textView create here
    //If u create UITextView by IB, u also can finish next work in IB.
    self.textView = UITextView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
    self.textView?.delegate = self
    self.view.addSubview(self.textView!)


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.


//Here we save text in textView everytime we edit textview, but we can delay saving until viewWillDisappear
//    func textViewDidChange(_ textView: UITextView) 
//        UserDefaults.standard.setValue(textView.text, forKey: "text")
//        UserDefaults.standard.synchronize()
//    

【讨论】:

你在说什么 //do textView create here.【参考方案2】:

    你可以在他们点击下一步按钮时保存

    节省viewWillDisappear

    您可以在每次文本更改时保存。在你的VC中实现UITextViewDelegate,然后编写这个函数:

    optional func textViewDidChange(_ textView: UITextView)
    

文档:https://developer.apple.com/reference/uikit/uitextviewdelegate

【讨论】:

我根据您的建议编辑了我的问题,但没有奏效。【参考方案3】:
class ViewController: UIViewController, UITextViewDelegate 

    @IBOutlet weak var txtView: UITextView!
    override func viewWillAppear(_ animated: Bool) 
        let myData = UserDefaults.standard.object(forKey: "myData") as? String ?? ""
        self.txtView?.text = myData
    
    //MARK: - TextView Delegate -
    func textViewDidChange(_ textView: UITextView) 
        UserDefaults.standard.setValue(self.txtView?.text, forKey: "myData")
        UserDefaults.standard.synchronize()
    

如果您想在不单击按钮的情况下保存 textView 的文本,则必须将其保存在 textViewDidChange 委托方法中。当您导航到下一个控制器时,将调用 viewWillDisappear。

【讨论】:

以上是关于如何在没有按钮操作的情况下使用 userdefualts 保存文本字段(swift3)的主要内容,如果未能解决你的问题,请参考以下文章

如何在此扩展程序中创建一个按钮,在不使用操作按钮的情况下在主应用程序中打开特定视图?

如何使用 JavaScript 在没有提交按钮的情况下提交“文件”输入?

如何在没有按钮的情况下提交表单?

如何在不使用 redux 中间件的情况下禁用/隐藏自适应卡片/操作按钮?

如何在没有编码的情况下使用按钮在android中打开另一个活动

如何在没有导航控制器的情况下获取导航栏后退按钮