Slice Horrest
Slice Horrest

Reputation: 33

How to save NSDate in CoreData taken from UITextField

I'm having a little trouble figuring out how to save an date taken from a UITextField to CoreData, also making it editable so when the user comes back to the date they can change it. Here is the code I have so far:

@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()
}

Upvotes: 1

Views: 1786

Answers (2)

Muhammad Junaid Butt
Muhammad Junaid Butt

Reputation: 464

Use SMDatePicker. It is written in Swift and easy to use. A customizable UIDatePicker with UIToolbar. Easy to setup, use & customize.

Implement the Delegate method of 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")
}

Hope it will work for you.

UPDATE

I wrote the method for you in Swift to Save date in CoreData. Hope it will work for you.

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")
    }
}

Upvotes: 1

Duncan Groenewald
Duncan Groenewald

Reputation: 8988

You might be better off creating a custom UITextField class that has a NSDate property which you set with the DatePicker - and which displays the currently set date. That way you never have to worry about converting from the UITextField.Text back to a date, you just use the CustomUITextField.date property.

I use a custom UIButton that looks just like a TextField except when it is editable and the user clicks on it I pop up a DatePicker so the user can edit the date. When they dismiss the DatePicker it passes the date back to the custom button control and sets its date property which then updates the buttons label with an appropriately formatted date or time. I can post the Obj-C classes if you want - sorry - no Swift classes... but you should be able to use them more or less as they are.

Upvotes: 0

Related Questions