Reputation: 33
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
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
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