Как сохранить NSDate в CoreData, взятом из UITextField

У меня возникли небольшие проблемы с выяснением того, как сохранить дату, взятую из UITextField, в CoreData, а также сделать ее редактируемой, чтобы, когда пользователь возвращается к дате, они могли ее изменить. Вот код, который у меня есть до сих пор:

@IBOutlet weak var dateField: UITextField!
@IBAction func dateField(sender: UITextField) {

    // This creates an Input View
    let inputView = UIView(frame: CGRectMake(0, 0, self.view.frame.width, 240))

    // This creates an Picker View for the date
    let datePickerView : UIDatePicker = UIDatePicker(frame: CGRectMake(0, 40, 0, 0))
    datePickerView.datePickerMode = UIDatePickerMode.Date
    inputView.addSubview(datePickerView)

    // Makes a toolbar with  a done button at the top of of the date picker view for it to dismiss the moment its clicked
    let doneButton = UIButton(frame: CGRectMake((self.view.frame.size.width/2) - (100/2), 0, 100, 50))
    doneButton.setTitle("Done", forState: UIControlState.Normal)
    doneButton.setTitle("Done", forState: UIControlState.Highlighted)
    doneButton.setTitleColor(UIColor.blackColor(), forState: UIControlState.Normal)
    doneButton.setTitleColor(UIColor.grayColor(), forState: UIControlState.Highlighted)

    // Adds the done button to the datepicker
    inputView.addSubview(doneButton)
    doneButton.addTarget(self, action: "doneButton:", forControlEvents: UIControlEvents.TouchUpInside)

    // Uses the date picker as a date picker using the format made in the function 'datePickerChanged'
    sender.inputView = inputView
    datePickerView.addTarget(self, action: Selector("datePickerChanged:"), forControlEvents: UIControlEvents.ValueChanged)

    // Immediately sets a date on start
    datePickerChanged(datePickerView)

}

func doneButton(sender : UIButton) {
    dateField.resignFirstResponder()
}

func datePickerChanged(sender : UIDatePicker) {
    // Creates a date sytle format for the date picker
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle
    dateFormatter.timeStyle = NSDateFormatterStyle.NoStyle
    dateField.text = dateFormatter.stringFromDate(sender.date)
}
 var dateSave : Product? = nil
 let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

if (dateSave != nil) {
        let dateFormatter = NSDateFormatter()
        var dateIn = dateFormatter.dateFromString(dateField.text!)
        dateIn = dateSave?.date
    }
func createProduct() {
    // Creates an Entity Description for the Core Data
    let entityDescription = NSEntityDescription.entityForName("dateSaved", inManagedObjectContext: moc)
    let datesaved = dateSaved(entity: entityDescription!, insertIntoManagedObjectContext: moc)
    // Creates Dates to save in coredata
    let dateFormatter = NSDateFormatter()
    var dateIn = dateFormatter.dateFromString(dateField.text!)
    product.date = dateIn
    do {
        try moc.save()
    } catch {
        return
    }
}
func editProduct() {
    // this function is for the edited dates that were already created
    let dateFormatter = NSDateFormatter()
    var dateIn = dateFormatter.dateFromString(dateField.text!)
    product?.date = dateIn
    do {
        try moc.save()
    } catch {
        return
    }
}
func dismissTVC() {
    navigationController?.popToRootViewControllerAnimated(true)
}

@IBAction func saveTapped(sender: AnyObject) {
    if (product != nil) {
        editProduct()
    } else {
        createProduct()
    }
    dismissTVC()
}

@IBAction func cancelTapped(sender: AnyObject) {
    dismissTVC()
}

person Slice Horrest    schedule 24.10.2015    source источник
comment
Так что именно не работает?   -  person Duncan Groenewald    schedule 25.10.2015
comment
часть, где я пытаюсь сохранить дату в CoreData, 'let dateformatter = NSDateFormatter()', где находится func createproduct(), и в viewdidload я пытался сохранить дату как NSDate и когда табличное представление загружен обратно, он снова появляется, поэтому я могу изменить его   -  person Slice Horrest    schedule 25.10.2015


Ответы (2)


Используйте SMDatePicker. Он написан на Swift и прост в использовании. Настраиваемый UIDatePicker с UIToolbar. Простота установки, использования и настройки.

Реализуйте метод делегата UITextFieldDelegate:

// MARK: - TextField Delegate Methods
func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
    if textField == self.myDateTextField {
        textField.resignFirstResponder()

        //show SMDatePicker
        var picker: SMDatePicker = SMDatePicker()
        picker.pickerMode = UIDatePickerMode.Date
        picker.showPickerInView(view, animated: true)
        picker.delegate = self

        return false
    }
    return true
}

// MARK: SMDatePickerDelegate
func datePicker(picker: SMDatePicker, didPickDate date: NSDate) {
     let dateFormater:NSDateFormatter = NSDateFormatter()
     dateFormater.dateFormat = "dd/MM/yyyy"
     let formatedDate:NSString = dateFormater.stringFromDate(date)
     self.myDateTextField.text = formatedDate as String
}

func datePickerDidCancel(picker: SMDatePicker) {
     print("Date Picker Cancel")
}

Надеюсь, это сработает для вас.

ОБНОВЛЕНИЕ

Я написал для вас метод сохранения даты в CoreData на Swift. Надеюсь, это сработает для вас.

func createProduct() {

    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext

    // Creates an Entity Description for the Core Data
    let productEntity = NSEntityDescription.insertNewObjectForEntityForName("Product", inManagedObjectContext: managedContext) as! Product

    // Creates Dates to save in coredata
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "dd/MM/yyyy"
    dateFormatter.timeZone = NSTimeZone(abbreviation: "UTC")

    let expiryDate = dateFormatter.dateFromString(dateField.text!)
    productEntity.expiryDate = expiryDate

    do {
        try managedContext.save()
    } catch {
        print("Unable to save Product in CoreData")
    }
}
person Muhammad Junaid Butt    schedule 24.10.2015
comment
@SliceHorrest: я обновил свой ответ, реализовав в Swift метод, который будет вставлять NSDate в CoreData. Пожалуйста, проверьте мой обновленный ответ и дайте мне знать, работает ли он для вас или нет. Спасибо - person Muhammad Junaid Butt; 25.10.2015
comment
Спасибо Это действительно помогло :) - person Slice Horrest; 25.10.2015

Возможно, вам лучше создать собственный класс UITextField со свойством NSDate, которое вы установили с помощью DatePicker, и которое отображает текущую установленную дату. Таким образом, вам никогда не придется беспокоиться о преобразовании UITextField.Text обратно в дату, вы просто используете свойство CustomUITextField.date.

Я использую настраиваемый UIButton, который выглядит так же, как TextField, за исключением случаев, когда он доступен для редактирования, и пользователь нажимает на него. Я открываю DatePicker, чтобы пользователь мог редактировать дату. Когда они отклоняют DatePicker, он передает дату обратно пользовательскому элементу управления кнопкой и устанавливает его свойство даты, которое затем обновляет метку кнопки с датой или временем в соответствующем формате. Я могу опубликовать классы Obj-C, если хотите - извините - нет классов Swift... но вы должны иметь возможность использовать их более или менее такими, какие они есть.

person Duncan Groenewald    schedule 24.10.2015
comment
да, пожалуйста, это будет очень полезно, я могу просто преобразовать его в быстрый, прочитав его, чтобы не было проблем с языком - person Slice Horrest; 24.10.2015
comment
Но мне действительно нужно просто знать, как сохранить дату, потому что кнопка «Готово» и все остальное работают. - person Slice Horrest; 24.10.2015