ios - 如何让 UIDatePicker 在 Swift 4 中更新文本字段和数据库
问题描述
在我的应用程序中,我有一个表单,它有一个文本字段,单击时会拉出一个 UIDatePicker。当我从 UIDatePicker 中选择新日期时,textField 不会更新。
调试时,似乎选择了新日期时未注册该操作,它只是在同一日期发送。
下面是我的代码(我计划在解决这个问题后重构/清理)
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()
通过情节提要创建文本字段的动作,即“编辑开始”
@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 函数来自定义 datepicker:
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() }
这是 datepickerview 的取消操作:
@objc func cancelClick(sender: UIButton) { dateTxt.resignFirstResponder() }
在这里你会得到pickerview的日期:
func setPickupDate(date: Date) { print(date) }
每次都可以在数据库中更新相同的代码
享受,快乐编码。
推荐阅读
- python - 如何计算列表中的整数范围
- scala - 类型类:不使用 `asInstanceOf`,但仍然得到 `ClassCastException`
- excel-formula - 具有通常无法正常工作的功能的 Excel 名称
- python - 将 NoSQL 数据转换为 SQL 数据 Python
- python - Django 干净字段模型表单
- flutter - Flutter 如何确定新 Toggled Camera 上可用的 Flash?
- javascript - 刷新页面时不知道如何保存localStorage
- android - 引起:java.util.zip.ZipException:重复条目:META-INF/versions/9/module-info.class
- keras - 加载 Keras 模型引发异常 - 使用 TextVectorization 层部署模型
- visual-studio-code - Visual Studio 代码错误,如何解决?