import { UIButton, UIControl } from "UIKit"
import { INativeButtonContext, CreateNativeButtonContext } from "../interface.uts"
import { CGFloat } from 'CoreFoundation';
export class NativeButton {
element : UniNativeViewElement;
button : UIButton | null = null;
constructor(element : UniNativeViewElement) {
// 接收组件传递过来的UniNativeViewElement
this.element = element;
super.init()
this.bindView();
}
// element 绑定原生view
bindView() {
// 初始化原生 UIButton
this.button = new UIButton(type=UIButton.ButtonType.system)
// 构建方法选择器
const method = Selector("buttonClickAction")
// button 绑定点击回调方法
button?.addTarget(this, action = method, for = UIControl.Event.touchUpInside)
// UniNativeViewElement 绑定原生 view
this.element.bindIOSView(this.button!);
}
updateText(text : string) {
// 更新 button 显示文字
this.button?.setTitle(text, for = UIControl.State.normal)
}
/**
* 按钮点击回调方法
* 在 swift 中,所有target-action (例如按钮的点击事件,NotificationCenter 的通知事件等)对应的 action 函数前面都要使用 @objc 进行标记。
*/
@objc buttonClickAction() {
//构建自定义 UniNativeViewEvent 对象
let event = new UniNativeViewEvent("customClick")
//触发自定义事件
this.element.dispatchEvent(event)
}
destroy() {
// 释放 UTS 实例对象,避免内存泄露
UTSiOS.destroyInstance(this)
}
}
function getNativeViewElemet(element: UniElement | null): UniNativeViewElement | null {
if (element == null) {
return null;
}
if (element instanceof UniNativeViewElement) {
return element as UniNativeViewElement
}
for (item in element!.children) {
let tmp = getNativeViewElemet(item)
if (tmp != null) {
return tmp
}
}
return null
}
export const createNativeButtonContext: CreateNativeButtonContext = function (id : string, component ?: ComponentPublicInstance | null) : INativeButtonContext | null {
let element : UniNativeViewElement | null = null;
let e: UniElement | null = null;
if (component == null) {
e = uni.getElementById(id)
} else {
e = component?.$el as UniElement | null;
}
if (e instanceof UniNativeViewElement) {
element = e as UniNativeViewElement | null
}else {
element = getNativeViewElemet(e)
}
if (element == null) return null;
return new NativeButtonContextImpl(element!);
}
class NativeButtonContextImpl implements INativeButtonContext {
btn: UIButton | null = null
constructor(element : UniNativeViewElement) {
let view = element.getIOSView()
if (view != null) {
this.btn = view as UIButton
}
}
updateText(title: string) : void {
this.btn?.setTitle(title, for = UIControl.State.normal)
}
}