当前位置: 首页 > news >正文

「Unity3D」TMP_InputField关闭虚拟键盘后,再次打开虚拟键盘,此时无法回调onSelect的问题

TMP_InputField可以注册一个onSelect回调函数,在InputField选中的时候回调,但在虚拟键盘手动关闭被返回取消的时候,此时再打开虚拟键盘时,就不会调用onSelect

原因在于,虚拟键盘有三种关闭的操作方式:

  • 第一,是点击虚拟机键盘外部,此时会失去焦点,即LostFocus事件。
  • 第二,是手动点击虚拟键盘的关闭按钮,此时什么事件都不触发,只是虚拟键盘隐藏。
  • 第三,是使用返回按键,此时会导致取消,即Canceled事件。

有趣的是:

  • 第一种,EventSystem.current.currentSelectedGameObject为——null。
  • 第二种,EventSystem.current.currentSelectedGameObject为——InputFieldgameObject
  • 第三种,EventSystem.current.currentSelectedGameObject为——InputFieldgameObject

所以,再次打开虚拟键盘,只有第一种正确回调onSelect——因为,第二种与第三种,InputField依然保持了选中状态,而再次选中同一个对象,不会响应回调,在InputFieldOnPointerDown中可以看到是调用了SetSelectedGameObject

EventSystem.current.SetSelectedGameObject(base.gameObject, eventData);


public void SetSelectedGameObject(GameObject selected, BaseEventData pointer)
{
    if (m_SelectionGuard)
    {
        Debug.LogError("Attempting to select " + selected?.ToString() + "while already selecting an object.");
        return;
    }

    m_SelectionGuard = true;
    if (selected == m_CurrentSelected)
    {
        m_SelectionGuard = false;
        return;
    }

    ExecuteEvents.Execute(m_CurrentSelected, pointer, ExecuteEvents.deselectHandler);
    m_CurrentSelected = selected;
    ExecuteEvents.Execute(m_CurrentSelected, pointer, ExecuteEvents.selectHandler);
    m_SelectionGuard = false;
}

于此同时,对于这三种情况,关闭虚拟键盘时onDeselect的回调如下:

  • 第一种,失去焦点,回调onDeselect,释放选中对象。
  • 第二种,手动关闭,不调用onDeselect,不释放选中对象。
  • 第三种,返回取消,回调onDeselect,不释放选中对象。

是的,这个返回取消,不能正确释放选中状态,还调用了onDeselect——因为这个onDeselect是被直接代码调用的,而不是通过SetSelectedGameObject触发的。

因此,要解决onSelect不调用的问题,就是关闭虚拟键盘时,手动调用EventSystem.current.SetSelectedGameObject(null)——但这会产生另一个小问题:

就是返回取消的时候,onDeselect会调用两次,即:一次来自SetSelectedGameObject,一次来自InputField自己——而失去焦点的情况,会清除选中状态,所以SetSelectedGameObject已经是null,就不会调用onDeselect

那么,解决的方法就是——使用onEndEdit来代替onDeselect

相关文章:

  • 文章配图新纪元:OpenAI新推出的GPT-4o原生图像生成功能启示
  • Joint Receiver Design for Integrated Sensing and Communications
  • 双向链表的理解
  • 【Kettle安装】Kettle安装过程, 电脑已安装java23,安装Kettle 出现报错:尝试启动 Java 虚拟机(JVM)时失败解决方法
  • JavaEE-MyBatis概述第一个程序
  • Redis GEO
  • [7-02-02].第15节:生产经验 - 消费者相关操作
  • 农产品直卖平台的设计与实现(代码+数据库+LW)
  • Burpsuite 伪造 IP
  • 数据结构与算法:二维动态规划
  • 图解AUTOSAR_SWS_CANDriver
  • 【区块链安全 | 第二十四篇】单位和全局可用变量(二)
  • 翻译: 人工智能如何让世界变得更美好四
  • BERT与Transformer到底选哪个-下部
  • css_z-index属性
  • C++STL---<functional>
  • 如何使用fiddler抓取手机APP的包,进行前后端bug定位
  • pyproj 库中Geod类—geod.npts()方法讲解
  • 智能制造:MES系统架构设计
  • github合并多个commit message以及rebase解决文件冲突
  • 做百度收录比较好的网站/泉州seo托管
  • 网站建设 asp 武汉/网站提交
  • 西安做网站多钱/免费舆情网站下载大全最新版
  • 网站建设流程哪家好/seo免费优化
  • 佛山哪里有做网站的/上优化seo
  • woocommerce做的网站/搜索引擎营销的常见方式