我有一个输入字段,其中包含一些有关选择和取消选择的重要处理程序。有其设置:
其他没有改变;我不包括这些处理程序,因为如果没有这些处理程序,该问题是可重现的。
当我按Enter键时,输入字段将确认输入,取消选择并调用事件。除了应该取消输入之外,Esc键也是如此。
当我按Enter键时,输入字段似乎保持选中状态,事件处理程序没有被调用,但是我无法键入文本,如果再次按Enter键,则输入字段似乎又被激活(它选择了所有文本并我已聚焦-全选)。 Esc键也有同样的问题。
我发现在按Enter键时会调用在结束编辑上事件,但是如何取消选择输入字段呢?它应调用取消选择事件,并且不应在Enter时再次激活。我试图致电DeactivateInputField
,但没有成功。
答案 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文档针对其生命周期/事件的各个部分显示了各种可用的方法。
其中之一是
public void DeactivateInputField()
另一个是
protected override void DoStateTransition(SelectionState state, bool instant)
我怀疑其中之一可用于停用您想要的字段。如果您在正确的时间手动拨打电话。
如何查看当前处理事件的锁定状态的示例,请参见以下链接:https://answers.unity.com/questions/1315276/event-system-setselectedgameobject-error-but-code.html
文档截图