如何将 NSDate 保存在取自 UITextField 的 CoreData 中
How to save NSDate in CoreData taken from 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()
}
您最好创建一个自定义 UITextField class,它具有您使用 DatePicker 设置的 NSDate 属性 - 并显示当前设置的日期。这样你就不必担心从 UITextField.Text 转换回日期,你只需使用 CustomUITextField.date 属性.
我使用了一个自定义的 UIButton,它看起来就像一个 TextField,除了当它是可编辑的并且用户点击它时我弹出一个 DatePicker 以便用户可以编辑日期。当他们关闭 DatePicker 时,它会将日期传回自定义按钮控件并设置其日期 属性,然后用适当格式的日期或时间更新按钮标签。如果你愿意,我可以 post Obj-C classes - 抱歉 - 不 Swift classes... 但你应该或多或少地使用它们作为他们是。
使用SMDatePicker。它是用 Swift 编写的,易于使用。带有 UIToolbar 的可自定义 UIDatePicker。易于设置、使用和自定义。
实现UITextFieldDelegate的Delegate方法:
// 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")
}
希望对你有用。
更新
我在 Swift 中为您编写了在 CoreData 中保存日期的方法。希望对你有用。
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")
}
}
我在弄清楚如何将从 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()
}
您最好创建一个自定义 UITextField class,它具有您使用 DatePicker 设置的 NSDate 属性 - 并显示当前设置的日期。这样你就不必担心从 UITextField.Text 转换回日期,你只需使用 CustomUITextField.date 属性.
我使用了一个自定义的 UIButton,它看起来就像一个 TextField,除了当它是可编辑的并且用户点击它时我弹出一个 DatePicker 以便用户可以编辑日期。当他们关闭 DatePicker 时,它会将日期传回自定义按钮控件并设置其日期 属性,然后用适当格式的日期或时间更新按钮标签。如果你愿意,我可以 post Obj-C classes - 抱歉 - 不 Swift classes... 但你应该或多或少地使用它们作为他们是。
使用SMDatePicker。它是用 Swift 编写的,易于使用。带有 UIToolbar 的可自定义 UIDatePicker。易于设置、使用和自定义。
实现UITextFieldDelegate的Delegate方法:
// 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")
}
希望对你有用。
更新
我在 Swift 中为您编写了在 CoreData 中保存日期的方法。希望对你有用。
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")
}
}