uidatepicker всегда переходит на текущее время - PullRequest
0 голосов
/ 07 ноября 2019

enter image description here enter image description here

Datepicker всегда прокручивается до текущего времени после нажатия кнопки, а также не отображается время выбора даты.

Я настраиваю средство выбора даты. Я пытаюсь подключить DatePicker и кнопку метки, чтобы показать правильное время. Я подключил кнопку «PickUp ASAP» к «@IBAction func buttonPressed», как показано в коде впереди, который работает нормально, т.е. показывает текущую дату и время в «Метке» при нажатии (здесь это 2019 11 06 04:20: PM)) (см. изображения выше и код ниже). Итак, здесь все в порядке.

Теперь я также попытался подключить «@IBAction func datePickerChanged», чтобы отображать текущую дату и время в «Метке» при прокрутке (см. Изображения выше и кодниже).

  1. Моя основная проблема заключается в том, что, как только я нажимаю кнопку «PickUP ASAP», независимо от того, что я делаю, средство выбора даты всегда прокручивает обратно к текущей дате и времени. Даже если я прокручиваю средство выбора даты до другой даты, оно всегда прокручивает обратно к текущей дате и времени.

  2. Другая проблема заключается в том, что «Метка» не отображает дату и время средства выбора даты. , если я прокручиваю DatePicker, не нажимая кнопку «Pickup ASAP». Я хочу, чтобы "Метка" показывала дату и время выбора даты при прокрутке.

Кроме того, формат отображения в «Метке», когда я нажимаю кнопку «Pickup ASAP» или прокручиваемую кнопку выбора даты, должен быть таким же.

Я прилагаюнеобходимые скриншоты симулятора и раскадровки соответственно выше.

     import UIKit

     @IBDesignable class testdateViewController: UIViewController {

     @IBOutlet weak var Label: UILabel!

     @IBOutlet weak var picker: UIDatePicker!

     @IBAction func buttonPressed(_ sender: UIButton) {

      picker.addTarget(self, action: #selector(buttonPressed), for: .valueChanged)
      let currentDateTime = Date()

      let formatter = DateFormatter()

      formatter.dateFormat = "yyyy MM dd hh:mm:  a"

      Label.text = " \( (formatter.string(from: currentDateTime)))"

      picker.date =  currentDateTime
    }

      override func viewDidLoad() {
       super.viewDidLoad()

     let datepicker = UIDatePicker()

     datepicker.addTarget(self, action: #selector(testdateViewController.datePickerChanged), for: UIControl.Event.valueChanged)
     }

     @IBAction func datePickerChanged(_ sender: Any) {

     let datePicker = UIDatePicker()
     let dateFormatter = DateFormatter()
     let strDate = dateFormatter.string(from: datePicker.date)
     Label.text = strDate
     }

     override func didReceiveMemoryWarning() {
     super.didReceiveMemoryWarning()
     // Dispose of any resources that can be recreated.
       }
     }

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Обновление кода:

Удалите этот код из ViewDidLoad()

let datepicker = UIDatePicker()
datepicker.addTarget(self, action: #selector(testdateViewController.datePickerChanged), for: UIControl.Event.valueChanged)

и используйте его в ViewDidLoad()

 picker.addTarget(self, action: #selector(testdateViewController.datePickerChanged), for: UIControl.Event.valueChanged)

Переместите некоторый код из метода buttonPressed в datePickerChanged.

datePickerChanged будет выглядеть так:

@IBAction func datePickerChanged(_ sender: Any) {
     updateData(date: picker.date) 
 } 

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

func updateData(date: Date) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy MM dd hh:mm:  a"
    let strDate = dateFormatter.string(from: picker.date)
    Label.text = strDate
}

И в методе ViewDidLoad () добавьте это

 updateData(date: Date()) // This will show the current date value

В конечном итоге ViewDidLoad() будет выглядеть как

override func viewDidLoad() {
   super.viewDidLoad() 
   picker.date =  Date() // You can set any date initially that you want. This will be a date object 
   picker.addTarget(self, action: #selector(testdateViewController.datePickerChanged), for: UIControl.Event.valueChanged)
   updateData(date: Date())
 }

А также удалите весь код изbuttonPressed. Потому что во время начальной загрузки на этикетке будет отображаться текущее время.

Полный код будет выглядеть как

import UIKit

class testdateViewController: UIViewController {

    @IBOutlet weak var Label: UILabel!
    @IBOutlet weak var picker: UIDatePicker!
    @IBAction func buttonPressed(_ sender: UIButton) {

    }

    override func viewDidLoad() {
        super.viewDidLoad()
        picker.date =  Date() // You can set any date initially that you want. This will be a date object
        picker.addTarget(self, action: #selector(testdateViewController.datePickerChanged), for: UIControl.Event.valueChanged)
        updateData(date: Date())

    }

    @IBAction func datePickerChanged(_ sender: Any) {
       updateData(date: picker.date)
    }

    func updateData(date: Date) {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy MM dd hh:mm:  a"
        let strDate = dateFormatter.string(from: picker.date)
        Label.text = strDate
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
0 голосов
/ 07 ноября 2019
    1. My main problem is that once I press the "PickUP ASAP" Button, no matter what I do, the datepicker always scrolls back to the current date and time. Even if I scroll the datePicker to a different date, it always scrolls back to the current date and time.

    Answer:- Because you set the current date to date picker in "PickUP ASAP" Button action.

    2. Another problem is that "Label" does not show any date and time of the datepicker, if I scroll the datepicker without clicking the "Pickup ASAP" button. I want the "Label" to show the date and time of the datepicker when scrolled.

    Answer:- In `viewDidLoad()` please replace the line with `picker = UIDatePicker()` and remove 
             `let datePicker = UIDatePicker()` from `datePickerChanged` method. Also  Please specify the format for the `DateFormatter()` in `datePickerChanged` method.

 Look at the code below:-

override func viewDidLoad() {
    super.viewDidLoad()
    picker = UIDatePicker()
    picker.datePickerMode = .date
    picker.addTarget(self, action: #selector(testdateViewController.datePickerChanged), for: UIControl.Event.valueChanged)
}

func datePickerChanged(_ sender: Any) {
    setDateValue()
}

func setDateValue() {
    let dateFormat = DateFormatter()
    dateFormat.dateFormat = "yyyy/MM/dd"
    let str = dateFormat.string(from: picker.date)
    Label.text = str
}

@IBAction func buttonPressed(_ sender: UIButton) {
    setDateValue()
}
...