123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- import { UIButton, UIControl } from "UIKit"
- import { INativeButtonContext, CreateNativeButtonContext } from "../interface.uts"
- import { CGFloat } from 'CoreFoundation';
- export class NativeButton {
- element : UniNativeViewElement;
- button : UIButton | 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
- 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)
- }
- }
|