更改后如何从 UIDatePicker 获取结果?

How do you get the results from a UIDatePicker upon change?

我的应用程序在 iOS 13 发布时崩溃了,我不知道如何修复它(是的,是的,我知道 iOS 13 已经发布了一段时间,我'我正忙着调查这个)。

我有一个 UIDatePicker,它被用作用户想要触发通知的时间设置。它采用 HH:MM 格式,通过检查器中的日期 > 自定义派生。我需要做的就是获取用户将时间更改为的任何内容并将其存储在变量中:一个用于小时,另一个用于分钟。然后,这些变量将用于在单击“保存”按钮时更新 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)")
    }

它连接到 swift 文件如下:

然后我的保存按钮会这样做:

@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.
}

}`

非常感谢任何帮助!

谢谢!

更新:

我认为您处理发件人的类型和字段的方式可能存在问题(我相信在您最近的问题编辑、AnyObject 与 Any 等中发生了变化)

试试这个:

@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
    }
}

一旦它开始工作,您就可以摆脱临时变量,但我认为这将有助于逐步完成并明确查看您的类型是什么以及您正在访问的发件人的哪些属性。


原回答:

您的选择器如何连接到您的 .xib 中的@IBAction?

我不确定早期系统版本中的正确方法,但如果您将 Value Changed 连接到控制器 @IBAction,它应该可以工作,如图所示: