index.uts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { UIDatePicker, UIControl, UIDatePickerStyle } from "UIKit"
  2. import { DateFormatter } from "CoreFoundation"
  3. export class NativeTimePicker {
  4. element : UniNativeViewElement
  5. timePicker : UIDatePicker
  6. h : number
  7. m : number
  8. constructor(element : UniNativeViewElement, hour : number, minute : number) {
  9. this.element = element
  10. this.timePicker = new UIDatePicker()
  11. this.h = hour
  12. this.m = minute
  13. super.init()
  14. // 在 swift target-action 对应的方法需要以OC的方式来调用,那么OC语言中用Selector来表示一个方法的名称(又称方法选择器),创建一个Selector可以使用 Selector("functionName") 的方式。
  15. const method = Selector("timeChange")
  16. // 监听时间变化回调
  17. this.timePicker.addTarget(this, action = method, for = UIControl.Event.valueChanged)
  18. // 设置为时间选择模式
  19. this.timePicker.datePickerMode = UIDatePicker.Mode.time
  20. // 设置外观样式为 wheels
  21. if (UTSiOS.available("iOS 13.4, *")) {
  22. this.timePicker.preferredDatePickerStyle = UIDatePickerStyle.wheels
  23. }
  24. this.updateTime()
  25. this.bindView(hour, minute)
  26. }
  27. // element 绑定原生view
  28. bindView(hour : number, minute : number) {
  29. this.element.bindIOSView(this.timePicker);
  30. }
  31. // 设置时
  32. setHour(hour : number) {
  33. this.h = hour
  34. this.updateTime()
  35. }
  36. // 设置分
  37. setMinute(minute : number) {
  38. this.m = minute
  39. this.updateTime()
  40. }
  41. // 更新显示
  42. updateTime() {
  43. let formatter = DateFormatter()
  44. formatter.dateFormat = "HH:mm"
  45. let date = formatter.date(from = `${this.h}:${this.m}`)
  46. if (date != null) {
  47. this.timePicker.date = date!
  48. }
  49. }
  50. /**
  51. * 按钮点击回调方法
  52. * 在 swift 中,所有target-action (例如按钮的点击事件,NotificationCenter 的通知事件等)对应的 action 函数前面都要使用 @objc 进行标记。
  53. */
  54. @objc timeChange() {
  55. // 发送事件
  56. console.log("timeChange")
  57. let formatter = DateFormatter()
  58. formatter.dateFormat = "HH"
  59. let hourString = formatter.string(from = this.timePicker.date)
  60. formatter.dateFormat = "mm"
  61. let minuteString = formatter.string(from = this.timePicker.date)
  62. const detail = { "hour": hourString, "minute": minuteString }
  63. const event = new UniNativeViewEvent("timechanged", detail)
  64. this.element.dispatchEvent(event)
  65. }
  66. destroy() {
  67. UTSiOS.destroyInstance(this)
  68. }
  69. }