9433cfb9创建于 2025年12月31日历史提交
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)
	}
}