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

我希望日期选择器在每次选择新日期时更新文本视图,并更新要传递给数据库的值。实际结果是一遍遍传的都是同一个日期

完成步骤:

  1. 首先初始化pickerview

     var datePickerView:UIDatePicker = UIDatePicker()
    
  2. 通过故事板创建文本字段的动作,即 "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)
    }
    
  3. 编写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
    }
    
  4. 跟踪日期选择器更改日期的操作:

    func datePickerValueChanged(sender:UIDatePicker)
    {
        self.setPickupDate(date: sender.date)     
    }
    
  5. 这是 datepickerview 的完成操作:

    @objc func doneClick(sender: UIButton)
    {
        self.setPickupDate(date: datePickerView.date)
        dateTxt.resignFirstResponder()
    }
    
  6. 这是日期选择器视图的取消操作:

    @objc func cancelClick(sender: UIButton) 
    {
         dateTxt.resignFirstResponder()
    }
    
  7. 在这里你会得到pickerview的日期:

    func setPickupDate(date: Date)
    {
        print(date)
    }
    

每次都可以在数据库中更新相同的代码

享受,编码愉快。