В настоящее время я работаю над календарем в своем приложении, которое пишу на Swift. Хотя он работает правильно, эти данные (журналы событий) можно вводить и добавлять в массив, который будет отображаться в табличном представлении, после того как приложение будет закрыто и удалено из фона, когда я снова его открою, журналы событий ушли.

Сделал ли я ошибки в своем коде?

import UIKit
import JTAppleCalendar
var event = [String]()
var userData = false

class CalendarViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var calendarView: JTAppleCalendarView!
@IBOutlet weak var monthAndYear: UILabel!
@IBOutlet weak var eventTable: UITableView!

override func viewDidAppear(_ animated: Bool) {
    eventTable.reloadData()
}

override func viewDidLoad() {
    super.viewDidLoad()
    configureCalendarView()

    userData = UserDefaults.standard.bool(forKey: "userData")

    if userData == true {
        UserDefaults.standard.object(forKey: "event")  //gets
    }

    else
    {
        event.append("NO USER DATA")
        UserDefaults.standard.set(event, forKey: "event")

        if event[0] == "NO USER DATA" {
            event.remove(at: 0)
            UserDefaults.standard.set(event, forKey: "event")
        }
    }
    eventTable.reloadData()
        }

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return event.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: nil)
    cell.textLabel?.text = event[indexPath.row]
    return cell
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == UITableViewCellEditingStyle.delete
    {
        event.remove(at: indexPath.row)
        UserDefaults.standard.set(event, forKey: "event")
    }
    eventTable.reloadData()
}

Если это необходимо, вот код, который позволяет вводить данные в массив:

class AddEventViewController: UIViewController {

@IBOutlet weak var eventText: UITextField!
@IBAction func addEvent(_ sender: Any) {

    userData = true
    UserDefaults.standard.set(userData, forKey: "userData")

    if eventText.text == ""
    {
    }
    else
    {
        event.append(eventText.text!)
        UserDefaults.standard.set(event, forKey: "event")
    }
}

Я пробовал использовать симулятор и настоящее устройство iOS вместе с переустановкой Xcode, потому что я читал, что это может быть проблема с самим Xcode. Я также пробовал добавлять UserDefaults.standard.synchronize () повсюду, однако, похоже, ничего не работает.

4
Lnskip 3 Янв 2018 в 01:55

2 ответа

Лучший ответ

Единственная строка в вашем коде, которая получает значение из UserDefaults, это ...

UserDefaults.standard.object(forKey: "event")

На самом деле это ничего не делает с этим значением. Он получает это ... а затем выбрасывает.

Это будет выглядеть так, как будто он не сохраняется.

Измените его на ...

event = UserDefaults.standard.object(forKey: "event")
3
Fogmeister 2 Янв 2018 в 23:20

Вам нужно позвонить synchronize() после вызова набора, чтобы сохранить изменения

UserDefaults.standard.synchronize()
-1
Abel C 2 Янв 2018 в 23:02