index.uts 2.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
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)
	}
}