Как получить результаты от UIDatePicker при изменении? - PullRequest
0 голосов
/ 14 июля 2020

Мое приложение сломалось, когда было выпущено iOS 13, и я не могу понять, как это исправить (Да, да, я знаю, что iOS 13 уже давно не работает, я просто собираюсь посмотреть в это).

У меня есть UIDatePicker, который используется в качестве настройки в течение времени, когда пользователь хочет инициировать уведомление. Это в формате ЧЧ: ММ, полученном с помощью Date> Custom в Инспекторе. Все, что мне нужно сделать, это получить все, что пользователь изменил время, и сохранить это в переменных: один для часа, а другой для минут. Эти переменные затем будут использоваться для обновления UserDefaults после нажатия кнопки «Сохранить».

Это то, что у меня есть сейчас, которое раньше работало до iOS 13:

    @IBAction func startDayPickerControl(_ sender: AnyObject) {
        // sets the hour and min vars to whatever was changed on the startDayPicker

        hour = sender.hour
        min = sender.minute

        print("Start day set to \(hour):\(min)")
    }

Это подключился к быстрому файлу следующим образом: введите описание изображения здесь

И тогда моя кнопка «Сохранить» сделает следующее:

@IBAction func saveSettingsButton(_ sender: AnyObject) {
       
        appUserSettings.set(hour, forKey: "hour")
        appUserSettings.set(min, forKey: "min")

        print("saveSettingsButton tapped")
    }

Я не могу понять, почему средство выбора даты не выводит данные при изменении. Все, что я получаю в print("Start day set to \(hour):\(min)"), это «Начальный день установлен на 0: 0»

Я пробовал тестовый проект на случай, если что-то испортилось с моим существующим во время преобразования версии Swift. Это то, что у меня есть, и я получаю тот же результат печати 0: 0:

`class ViewController: UIViewController {

var hour = 8
var min = 30

@IBOutlet var CurrentSetTime: UILabel!

@IBAction func TimePicker(_ sender: Any) {
    // sets the hour and min vars to whatever was changed on the startDayPIcker
    // Xcode forced these changes from my above code here, but didn't on my original project
    hour = (sender as AnyObject).hour 
    min = (sender as AnyObject).minute
    
    CurrentSetTime.text = "\(hour):\(min)"
    print("Start day set to \(hour):\(min)")
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
}

}`

Любая помощь будет буду очень признателен!

Спасибо!

1 Ответ

1 голос
/ 14 июля 2020

ОБНОВЛЕНО:

Я думаю, что может быть проблема в том, как вы обрабатываете тип и поля отправителя (которые, как мне кажется, изменились в ваших недавних изменениях вопроса, AnyObject vs . Any et c.)

Попробуйте это:

@IBAction func TimePicker(_ sender: Any) {
    if let picker = sender as? UIDatePicker {
        let calendar = Calendar.current
        let tempHour = calendar.component(.hour, from: picker.date)
        let tempMinute = calendar.component(.minute, from: picker.date)

        Swift.print("hour: \(tempHour) minute: \(tempMinute)")
        hour = tempHour
        minute = tempMinute
    }
}

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

Исходный ответ:

Как ваш сборщик подключен к @IBAction в вашем .xib?

Я не уверен, что это был правильный способ в более ранней системе версий, но он должен работать, если вы подключите соединение Value Changed к контроллеру @IBAction, как показано на рисунке:

снимок экрана соединения UIDatePicker и Value Changed

...