Как добавить UserDefaults в список задач - Swift - PullRequest
0 голосов
/ 22 апреля 2020

Я пытался добавить userDefaults в мой код и пытался сохранить, например, задачу, чтобы в следующий раз, когда я открою приложение, я все еще мог видеть задачу. не ушел, понял, как работают userDefaults. Может быть, кто-то может мне помочь?

taskList V C file:

@ IBAction fun c 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)

}

mainV C файл:

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 Ответ

0 голосов
/ 22 апреля 2020

С пользовательскими настройками по умолчанию вы можете делать практически все, что вам нужно, но имейте в виду, что это внутренняя база данных, для мелочей, таких как проверка логических значений, целочисленных минимальных данных, которые вам нужны как дополнительные логики c не как место хранения, я планирую чтобы сохранить много записей вашей 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() {

            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...