Swift 4 中如何使 UIDatePicker 更新文本字段和数据库
How to make UIDatePicker update textfield and database in Swift 4
在我的应用程序中,我有一个表单,其中包含一个文本字段,单击该表单会调出一个 UIDatePicker。当我 select 来自 UIDatePicker 的新日期时,文本字段不会更新。
调试时,似乎 select 编辑了新日期时,操作未注册,只是在同一日期发送。
下面是我的代码(我计划在解决这个问题后 refactoring/cleaning 上线)
import UIKit
import RealmSwift
class ClientDetailsViewController: UIViewController, UITextFieldDelegate, UIPickerViewDelegate, UIPickerViewDataSource {
let realm = try! Realm()
//Create Picker Views
let dateAppointedPickerView = UIDatePicker()
@IBOutlet weak var clientDateAppointedText: UITextField!
var selectedClient : Client? {
//Everything in the did set function will happen as soon as this variable is set with a value
didSet {
loadClientDetails()
}
}
override func viewDidLoad() {
super.viewDidLoad()
//Assign Picker Views
setPickerViews()
//Assign Picker View Settings
setPickerViewSettings()
//Assign Picker View Delegates
setDelegates()
}
//MARK: - Date Format Method
func formatDateToString(_ date: Date) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM dd, yyyy"
dateFormatter.locale = Locale.current
let formattedDate = dateFormatter.string(from: date)
return formattedDate
}
func formatStringToDate(_ dateString: String) -> Date {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM dd, yyyy"
dateFormatter.locale = Locale.current
let formattedDate = dateFormatter.date(from: dateString)
return formattedDate!
}
func loadClientDetails() {
loadViewIfNeeded()
clientDateAppointedText.text = formatDateToString((selectedClient?.dateAppointed)!)
}
//Send textfield/picker data to database
func textFieldDidEndEditing(_ textField: UITextField) {
var clientData : String = ""
guard let currentClient = selectedClient else {fatalError()}
switch textField {
case clientDateAppointedText:
clientData = "clientDateAppointedText"
updateClientDetails(currentClient, clientData)
default:
print("Did not edit anything")
}
}
//MARK: - Data Manipulation Methods
func updateClientDetails(_ clientInfo: Client,_ clientString: String) {
let editClient : String = clientString
do {
try realm.write {
switch editClient {
case "clientDateAppointedText":
clientInfo.dateAppointed = formatStringToDate(clientDateAppointedText.text!)
default:
print("Unable to edit client information")
}
}
} catch {
print("Unable to save client details")
}
}
我希望日期选择器在每次选择新日期时更新文本视图,并更新要传递给数据库的值。实际结果是一遍遍传的都是同一个日期
完成步骤:
首先初始化pickerview
var datePickerView:UIDatePicker = UIDatePicker()
通过故事板创建文本字段的动作,即 "Editing Did Begin"
@IBAction func textEditing(_ sender: UITextField)
{
isPickUpSelected = true
datePickerView = UIDatePicker()
datePickerView.minimumDate = Date()
datePickerView.date = selectedPickupDate
datePickerView.datePickerMode = UIDatePickerMode.date
sender.inputView = datePickerView
datePickerView.addTarget(self, action:
#selector(TUGBestDealVC.datePickerValueChanged), for:
UIControlEvents.valueChanged)
self.addToolBar(picker: datePickerView, textField: sender)
}
编写addToolbar函数自定义日期选择器:
func addToolBar(picker: UIDatePicker, textField: UITextField)
{
toolBar.barStyle = .default
toolBar.isTranslucent = true
toolBar.tintColor = UIColor.darkGray
toolBar.sizeToFit()
let doneButton = UIBarButtonItem(title: TUGHelpers().getLocalisedString(strKey:
"DONE"),style: .plain, target: self,
action:#selector(TUGBestDealVC.doneClick(sender:)))
doneButton.tag = picker.tag
let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target:
nil,action: nil)
let cancelButton = UIBarButtonItem(title:"Cancel", style: .plain, target: self,
action:#selector(TUGBestDealVC.cancelClick(sender:)))
cancelButton.tag = picker.tag+4
toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
textField.inputAccessoryView = toolBar
}
跟踪日期选择器更改日期的操作:
func datePickerValueChanged(sender:UIDatePicker)
{
self.setPickupDate(date: sender.date)
}
这是 datepickerview 的完成操作:
@objc func doneClick(sender: UIButton)
{
self.setPickupDate(date: datePickerView.date)
dateTxt.resignFirstResponder()
}
这是日期选择器视图的取消操作:
@objc func cancelClick(sender: UIButton)
{
dateTxt.resignFirstResponder()
}
在这里你会得到pickerview的日期:
func setPickupDate(date: Date)
{
print(date)
}
每次都可以在数据库中更新相同的代码
享受,编码愉快。
在我的应用程序中,我有一个表单,其中包含一个文本字段,单击该表单会调出一个 UIDatePicker。当我 select 来自 UIDatePicker 的新日期时,文本字段不会更新。
调试时,似乎 select 编辑了新日期时,操作未注册,只是在同一日期发送。
下面是我的代码(我计划在解决这个问题后 refactoring/cleaning 上线)
import UIKit
import RealmSwift
class ClientDetailsViewController: UIViewController, UITextFieldDelegate, UIPickerViewDelegate, UIPickerViewDataSource {
let realm = try! Realm()
//Create Picker Views
let dateAppointedPickerView = UIDatePicker()
@IBOutlet weak var clientDateAppointedText: UITextField!
var selectedClient : Client? {
//Everything in the did set function will happen as soon as this variable is set with a value
didSet {
loadClientDetails()
}
}
override func viewDidLoad() {
super.viewDidLoad()
//Assign Picker Views
setPickerViews()
//Assign Picker View Settings
setPickerViewSettings()
//Assign Picker View Delegates
setDelegates()
}
//MARK: - Date Format Method
func formatDateToString(_ date: Date) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM dd, yyyy"
dateFormatter.locale = Locale.current
let formattedDate = dateFormatter.string(from: date)
return formattedDate
}
func formatStringToDate(_ dateString: String) -> Date {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM dd, yyyy"
dateFormatter.locale = Locale.current
let formattedDate = dateFormatter.date(from: dateString)
return formattedDate!
}
func loadClientDetails() {
loadViewIfNeeded()
clientDateAppointedText.text = formatDateToString((selectedClient?.dateAppointed)!)
}
//Send textfield/picker data to database
func textFieldDidEndEditing(_ textField: UITextField) {
var clientData : String = ""
guard let currentClient = selectedClient else {fatalError()}
switch textField {
case clientDateAppointedText:
clientData = "clientDateAppointedText"
updateClientDetails(currentClient, clientData)
default:
print("Did not edit anything")
}
}
//MARK: - Data Manipulation Methods
func updateClientDetails(_ clientInfo: Client,_ clientString: String) {
let editClient : String = clientString
do {
try realm.write {
switch editClient {
case "clientDateAppointedText":
clientInfo.dateAppointed = formatStringToDate(clientDateAppointedText.text!)
default:
print("Unable to edit client information")
}
}
} catch {
print("Unable to save client details")
}
}
我希望日期选择器在每次选择新日期时更新文本视图,并更新要传递给数据库的值。实际结果是一遍遍传的都是同一个日期
完成步骤:
首先初始化pickerview
var datePickerView:UIDatePicker = UIDatePicker()
通过故事板创建文本字段的动作,即 "Editing Did Begin"
@IBAction func textEditing(_ sender: UITextField) { isPickUpSelected = true datePickerView = UIDatePicker() datePickerView.minimumDate = Date() datePickerView.date = selectedPickupDate datePickerView.datePickerMode = UIDatePickerMode.date sender.inputView = datePickerView datePickerView.addTarget(self, action: #selector(TUGBestDealVC.datePickerValueChanged), for: UIControlEvents.valueChanged) self.addToolBar(picker: datePickerView, textField: sender) }
编写addToolbar函数自定义日期选择器:
func addToolBar(picker: UIDatePicker, textField: UITextField) { toolBar.barStyle = .default toolBar.isTranslucent = true toolBar.tintColor = UIColor.darkGray toolBar.sizeToFit() let doneButton = UIBarButtonItem(title: TUGHelpers().getLocalisedString(strKey: "DONE"),style: .plain, target: self, action:#selector(TUGBestDealVC.doneClick(sender:))) doneButton.tag = picker.tag let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil,action: nil) let cancelButton = UIBarButtonItem(title:"Cancel", style: .plain, target: self, action:#selector(TUGBestDealVC.cancelClick(sender:))) cancelButton.tag = picker.tag+4 toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) toolBar.isUserInteractionEnabled = true textField.inputAccessoryView = toolBar }
跟踪日期选择器更改日期的操作:
func datePickerValueChanged(sender:UIDatePicker) { self.setPickupDate(date: sender.date) }
这是 datepickerview 的完成操作:
@objc func doneClick(sender: UIButton) { self.setPickupDate(date: datePickerView.date) dateTxt.resignFirstResponder() }
这是日期选择器视图的取消操作:
@objc func cancelClick(sender: UIButton) { dateTxt.resignFirstResponder() }
在这里你会得到pickerview的日期:
func setPickupDate(date: Date) { print(date) }
每次都可以在数据库中更新相同的代码
享受,编码愉快。