将日期保存到核心数据

时间:2017-02-21 00:32:58

标签: ios swift core-data

好的,所以我正在尝试在XCode 8中学习Swift 3.我已经按照一些教程,我正在尝试构建自己的应用程序,这将让我保存一个包含日期和类别的事件

现在我很难将日期保存到核心数据中。最重要的是,我想在UITextfield中显示完整的日期风格,但在核心数据中将其保存为短日期风格。

有人有解决方案吗?请注意,我是一个n00b,我不是所有正确的术语。所以请告诉我需要改变什么,因为我还在学习所有不同的东西......

我认为我应该做的是创建一个函数,它将格式化字符串以保存核心数据(实体'MyEvents'的属性'dateOfEvent'设置为'date'),然后从datePickerChanged函数始终保持更新。

到目前为止,我已经提出了这个问题,这是我发现的不同教程的混合。

import UIKit

class addEventViewController: UIViewController, UITextFieldDelegate, UIPickerViewDataSource, UIPickerViewDelegate {
    @IBOutlet weak var addEventNameInput: UITextField!
    @IBOutlet weak var addEventDateInput: UITextField!
    @IBOutlet weak var addEventCategoryInput: UITextField!

    var addEventCategories = ["Født", "Startede børnehave", "Startede uddannelse", "Startede job", "Flyttede hjemmefra", "Startede romantisk forhold", "Startede forhold"]
    var categoryPicker = UIPickerView()

    let datePicker = UIDatePicker()

    func textFieldDidBeginEditing(_ textField: UITextField) {
        addEventDateInput.inputView = datePicker
        datePicker.datePickerMode = .date
        datePicker.addTarget(self, action: #selector(datePickerChanged), for: .valueChanged)
    }

    func datePickerChanged(sender: UIDatePicker) {
        let formatter = DateFormatter()
        formatter.dateStyle = .full
        formatter.timeStyle = .none

        addEventDateInput.text = formatter.string(from: sender.date)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        addEventNameInput.delegate = self
        addEventDateInput.delegate = self

        categoryPicker.delegate = self
        categoryPicker.dataSource = self
        addEventCategoryInput.inputView = categoryPicker
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

    // returns the number of 'columns' to display.
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    // returns the # of rows in each component..
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return addEventCategories.count
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        addEventCategoryInput.text = addEventCategories[row]
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return addEventCategories[row]
    }

    @IBAction func addEventButtonPressed(_ sender: Any) {
        if addEventNameInput.text == "" {
        } else {
            let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

            let newevent = MyEvents(context: context)
            newevent.nameOfevent = addEventNameInput.text!
            newevent.categoryOfevent = addEventCategoryInput.text!

            // Save data to coredata
            (UIApplication.shared.delegate as! AppDelegate).saveContext()

            // Pop back to events list
            navigationController!.popViewController(animated: true)
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您应该将日期保存为数据库中的日期。日期对象表示特定时刻,因此没有“没有时间的日期”。

使用日期格式器仅向用户显示您感兴趣的日期部分。不要将显示格式与数据存储混淆。

所以您需要的是托管对象上的Date类型属性,您可以将其设置为选择器的date属性。