首页 > 解决方案 > 如何让 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")
        }
    }

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

标签: iosswiftdatepickeruidatepicker

解决方案


步骤:

  1. 首先初始化pickerview

     var datePickerView:UIDatePicker = UIDatePicker()
    
  2. 通过情节提要创建文本字段的动作,即“编辑开始”

    @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 函数来自定义 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
    }
    
  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. 这是 datepickerview 的取消操作:

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

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

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

享受,快乐编码。


推荐阅读