如何将 UserDefaults 添加到任务列表中 - Swift

Posted

技术标签:

【中文标题】如何将 UserDefaults 添加到任务列表中 - Swift【英文标题】:How to add UserDefaults into a task list - Swift 【发布时间】:2020-04-22 09:48:26 【问题描述】:

我一直在尝试将 userDefaults 添加到我的代码中并尝试保存例如一个任务,以便下次打开应用程序时我仍然可以看到该任务。 没有退出了解 userDefaults 是如何工作的。也许有人可以帮助我?

taskList VC 文件:

@IBAction func doneButton_Tapped(_ sender: Any) var newTask = taskList()

newTask.name = taskNameField.text!
newTask.dueDate = dueDatePicker.date

newTask.dateCreated = Date()

taskArr.append(newTask)


didCreateTask = true

self.navigationController?.popViewController(animated: true)

ma​​inVC 文件:

struct taskList 
    var name: String!
    var dateCreated: Date!
    var dueDate:Date!


private let listIdentifier = "listIdentifier"


var taskArr: [taskList] = []

let defauls = UserDefaults.standard

class ViewController: UIViewController 

    @IBOutlet var tableView:UITableView!

    override func viewDidLoad() 
        super.viewDidLoad()
        self.title = "Tasks List"

        tableView.delegate = self
        tableView.dataSource = self


    

    override func viewWillAppear(_ animated: Bool) 
        super.viewWillAppear(animated)
        tableView.reloadData()

    


    @IBAction func newTaskButton_Tapped(_ sender: Any)
        self.performSegue(withIdentifier: "newTaskSague", sender: nil)
    








extension ViewController: UITableViewDelegate
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        tableView.deselectRow(at: indexPath, animated: true)
    



extension ViewController:UITableViewDataSource
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int return taskArr.count


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: listIdentifier, for: indexPath) as! listCell

        let row = indexPath.row
        let formatter = DateFormatter()

        cell.title?.text = taskArr[row].name

        formatter.dateStyle = .medium
        formatter.timeStyle = .short
        cell.subTitle?.text = "Due: \(formatter.string(from: taskArr[row].dueDate))"
        return cell
    

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) 
        if editingStyle == .delete
            taskArr.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)
        
    

【问题讨论】:

【参考方案1】:

使用用户默认值,您几乎可以满足您的任何需求,但请注意,这是一个内部数据库,用于检查布尔值,整数最小数据,您需要作为额外逻辑而不是存储位置,我打算保存一个您的 Task 模型的大量条目,您应该考虑使用 CoreData。

我的建议是在您的 UserDefaults 中保存一组任务(如果不是那么多),当您来自后台时,您需要检查您的 UserDefaults 是否为空,例如

override func viewDidLoad() 
super.viewDidLoad()

let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(appMovedToForeground), name: Notification.Name.UIApplicationWillEnterForeground, object: nil)


func appMovedToForeground() 

    print("come from background")

对于你需要使用归档器的对象数组,你需要在appMoveToForeground的方法中添加类似的东西:

guard let dataTasks = UserDefaults.standard.object(forKey: "task") as? Data else  return nil 
if let tasks = try NSKeyedUnarchiver.unarchivedObject(ofClasses: [Task.self], from: dataTasks)
            if tasks.isNotEmpty() 

            
        
    

【讨论】:

请注意,您需要以与对象存档相同的方式保存任务,并记得添加 .synchonize() 方法 我仍然不知道如何在我的代码中实现这一点。我不想保存大量数据,只是其中几个我不需要使用 coreData【参考方案2】:

我仍然不知道如何在我的代码中实现这一点。我不想保存大量数据,只是其中几个我不需要使用 coreData

【讨论】:

以上是关于如何将 UserDefaults 添加到任务列表中 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

如何将完整的 UserDefaults 列表放入 tableview - Swift 3

在 Swift 3.1 中将自己的对象数组添加到 UserDefaults 时出错

如何从 UserDefaults 向数组添加值?

UserDefaults 存储数组中的按钮选择

如何使用“UserDefaults.standard.set()”将信息从一个控制器传递到另一个控制器

在不删除原始 UserDefault 信息的情况下将数组附加到 UserDefaults