Как заставить UIDatePicker обновлять текстовое поле и базу данных в Swift 4 - PullRequest
0 голосов
/ 27 января 2019

В моем приложении есть форма с текстовым полем, которое при нажатии вызывает 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")
        }
    }

Я ожидаю, что средство выбора даты будет обновлять текстовое представление каждый раз, когда выбирается новая дата, и длязначение для передачи в базу данных для обновления.Фактический результат заключается в том, что переданное значение снова и снова совпадает с датой.

1 Ответ

0 голосов
/ 27 января 2019

Шаги, чтобы сделать это:

  1. Первое инициализировать представление выбора

     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 для настройки средства выбора даты:

    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. Здесь вы получите дату просмотра:

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

Один и тот же код, который вы можете обновлять в базе данных каждый раз

Наслаждайтесь, счастливого кодирования.

...