import { UIDatePicker, UIControl, UIDatePickerStyle } from "UIKit" import { DateFormatter } from "CoreFoundation" export class NativeTimePicker { element : UniObjectElement timePicker : UIDatePicker h : number m : number constructor(element : UniObjectElement, hour : number, minute : number) { this.element = element this.timePicker = new UIDatePicker() this.h = hour this.m = minute super.init() // 在 swift target-action 对应的方法需要以OC的方式来调用,那么OC语言中用Selector来表示一个方法的名称(又称方法选择器),创建一个Selector可以使用 Selector("functionName") 的方式。 const method = Selector("timeChange") // 监听时间变化回调 this.timePicker.addTarget(this, action = method, for = UIControl.Event.valueChanged) // 设置为时间选择模式 this.timePicker.datePickerMode = UIDatePicker.Mode.time // 设置外观样式为 wheels if (UTSiOS.available("iOS 13.4, *")) { this.timePicker.preferredDatePickerStyle = UIDatePickerStyle.wheels } this.updateTime() this.bindView(hour, minute) } // element 绑定原生view bindView(hour : number, minute : number) { this.element.bindIOSView(this.timePicker); } // 设置时 setHour(hour : number) { this.h = hour this.updateTime() } // 设置分 setMinute(minute : number) { this.m = minute this.updateTime() } updateTime() { let formatter = DateFormatter() formatter.dateFormat = "HH:mm" let date = formatter.date(from = `${this.h}:${this.m}`) if (date != null) { this.timePicker.date = date! } } /** * 按钮点击回调方法 * 在 swift 中,所有target-action (例如按钮的点击事件,NotificationCenter 的通知事件等)对应的 action 函数前面都要使用 @objc 进行标记。 */ @objc timeChange() { // 发送事件 console.log("timeChange") let formatter = DateFormatter() formatter.dateFormat = "HH" let hourString = formatter.string(from = this.timePicker.date) formatter.dateFormat = "mm" let minuteString = formatter.string(from = this.timePicker.date) const detail = { "hour": hourString, "minute": minuteString } const event = new UniObjectCustomEvent("timechanged", detail) this.element.dispatchEvent(event) } destroy() { UTSiOS.destroyInstance(self) } }