104 行
2.8 KiB
Plaintext
104 行
2.8 KiB
Plaintext
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 对象
|
|
const detail = {
|
|
value: "CustomValue"
|
|
}
|
|
let event = new UniNativeViewEvent("customClick", detail)
|
|
//触发自定义事件
|
|
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)
|
|
}
|
|
}
|