如何使Enterm键上的Textmesh Pro输入字段取消选择?

时间:2019-05-15 09:04:22

标签: unity3d unity3d-ui

我有一个输入字段,其中包含一些有关选择和取消选择的重要处理程序。有其设置:

enter image description here

其他没有改变;我不包括这些处理程序,因为如果没有这些处理程序,该问题是可重现的。


期望

当我按Enter键时,输入字段将确认输入,取消选择并调用事件。除了应该取消输入之外,Esc键也是如此。

现实

当我按Enter键时,输入字段似乎保持选中状态,事件处理程序没有被调用,但是我无法键入文本,如果再次按Enter键,则输入字段似乎又被激活(它选择了所有文本并我已聚焦-全选)。 Esc键也有同样的问题。


我发现在按Enter键时会调用在结束编辑上事件,但是如何取消选择输入字段呢?它应调用取消选择事件,并且不应在Enter时再次激活。我试图致电DeactivateInputField,但没有成功。

1 个答案:

答案 0 :(得分:1)

新答案,已解决了该问题,请参阅注释以进行澄清:

TextMesh Pro使用Unity内置的EventSystem。因此,通过EventSystem完成取消选择等操作:

EventSystem.current.SetSelectedGameObject(null);

因此,“ OnDeselect”事件是通过EventSystem的选择管理而不是TextMesh Pro调用的。

在事件系统中选择新内容时,还需要确保当前未以锁定方式选择其他内容。 EventSystem中有一个保护/锁定,可以防止在这种情况下设置未选择的对象,但是会显示错误:

  

在已经选择对象的同时尝试选择。
  UnityEngine.EventSystems.EventSystem:SetSelectedGameObject(GameObject)

您应该检查它是否已经选择了另一个对象:

var eventSystem = EventSystem.current;
if (!eventSystem.alreadySelecting) eventSystem.SetSelectedGameObject (null);

Other post where they discuss the 'lock' part of the EventSystem.




旧答案,不能解决问题,但有助于理解以下评论线索:

我的理解

我没有使用TextMesh Pro的经验,所以不能确定地说当您按下Enter键时事件的周期如何。

但是,您解释说,它至少调用了“ On End Edit”方法。我会仔细阅读他们的文档,并测试它调用的其他方法(如果我是您的话)。因为这将帮助您更好地了解发生的情况。调用了哪些方法,等等。

该怎么办?

TextMesh Pro文档针对其生命周期/事件的各个部分显示了各种可用的方法。

Documentation

其中之一是

public void DeactivateInputField()

另一个是

protected override void DoStateTransition(SelectionState state, bool instant)

我怀疑其中之一可用于停用您想要的字段。如果您在正确的时间手动拨打电话。

如何查看当前处理事件的锁定状态的示例,请参见以下链接:https://answers.unity.com/questions/1315276/event-system-setselectedgameobject-error-but-code.html


文档截图

Image from documentation