2017-02-21 166 views
0

好吧,所以我想學習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) 
     } 
    } 
} 
+0

所以你有一個名爲'dateOfEvent'的'NSManagedObject'作爲'MyEvents'的一部分,對吧?您應該可以通過說'new event.dateOfEvent = datePicker.date'來設置當前日期與datePicker的值。 – Pierce

+0

謝謝,皮爾斯! 這確實保存日期,但它也節省時間。我只想要日期:-) – Polle

+0

@Polle沒有「僅限日期」。將實際日期保存到數據庫中,並使用日期格式化程序將這些值顯示給用戶。 – jrturton

回答

0

您應該將日期保存爲數據庫中的日期。日期對象表示特定時刻,因此沒有「沒有時間的日期」。

使用日期格式化程序僅顯示您對用戶感興趣的日期部分。不要將顯示格式與數據存儲混淆。

因此,您需要的是您的託管對象上的Date類型屬性,該屬性設置爲拾取器的date屬性。