如何使 Textmesh Pro 输入字段在回车键上取消选择?
How to make Textmesh Pro Input Field deselect on enter key?
我有一个输入字段,其中包含一些关于选择和取消选择的重要处理程序。有它的设置:
没有其他改变;我不包括这些处理程序,因为没有它们问题是可以重现的。
预期
当我回车时,输入框确认输入,取消选择并调用事件。 Esc键同理,只是要取消输入
现实
当我按下 Enter 时,输入字段似乎保持选中状态,未调用事件处理程序,但我无法输入文本,如果我再次按下 Enter,输入字段似乎再次激活(它选择了所有text 并且我启用了 On Focus - Select All)。 Esc 键也有同样的问题。
我发现 On End Edit 事件在按下 Enter 时被调用,但如何取消选择输入字段?它应该调用 On Deselect 事件并且不应在 Enter 时再次激活。我尝试调用 DeactivateInputField
,但没有成功。
新答案,问题已解决,详见评论:
TextMesh Pro 使用 Unity 的内置 EventSystem
。为此,de-select之类的都是通过EventSystem
:
EventSystem.current.SetSelectedGameObject(null);
因此 "OnDeselect" 事件是通过 EventSystem
的 select 离子管理调用的,而不是 TextMesh Pro。
当您使用事件系统 select 一些新的东西时,您还需要确保其他东西目前没有 select 以锁定的方式编辑。在EventSystem
中有一个protection/lock,它可以防止在这种情况下设置没有对象selected,但会打印错误:
Attempting to select while already selecting an object.
UnityEngine.EventSystems.EventSystem:SetSelectedGameObject(GameObject)
您应该检查它是否已经 select 另一个对象:
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 文档显示了其 lifecycle/events 各个部分的各种可用方法。
其中之一是
public void DeactivateInputField()
另一个是
protected override void DoStateTransition(SelectionState state, bool instant)
我怀疑其中之一可用于停用您想要的字段。如果你在合适的时间手动调用它们。
如何检查当前处理事件的锁定状态的示例,可以在这个link中看到:https://answers.unity.com/questions/1315276/event-system-setselectedgameobject-error-but-code.html
文档截图
我有一个输入字段,其中包含一些关于选择和取消选择的重要处理程序。有它的设置:
没有其他改变;我不包括这些处理程序,因为没有它们问题是可以重现的。
预期
当我回车时,输入框确认输入,取消选择并调用事件。 Esc键同理,只是要取消输入
现实
当我按下 Enter 时,输入字段似乎保持选中状态,未调用事件处理程序,但我无法输入文本,如果我再次按下 Enter,输入字段似乎再次激活(它选择了所有text 并且我启用了 On Focus - Select All)。 Esc 键也有同样的问题。
我发现 On End Edit 事件在按下 Enter 时被调用,但如何取消选择输入字段?它应该调用 On Deselect 事件并且不应在 Enter 时再次激活。我尝试调用 DeactivateInputField
,但没有成功。
新答案,问题已解决,详见评论:
TextMesh Pro 使用 Unity 的内置 EventSystem
。为此,de-select之类的都是通过EventSystem
:
EventSystem.current.SetSelectedGameObject(null);
因此 "OnDeselect" 事件是通过 EventSystem
的 select 离子管理调用的,而不是 TextMesh Pro。
当您使用事件系统 select 一些新的东西时,您还需要确保其他东西目前没有 select 以锁定的方式编辑。在EventSystem
中有一个protection/lock,它可以防止在这种情况下设置没有对象selected,但会打印错误:
Attempting to select while already selecting an object.
UnityEngine.EventSystems.EventSystem:SetSelectedGameObject(GameObject)
您应该检查它是否已经 select 另一个对象:
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 文档显示了其 lifecycle/events 各个部分的各种可用方法。
其中之一是
public void DeactivateInputField()
另一个是
protected override void DoStateTransition(SelectionState state, bool instant)
我怀疑其中之一可用于停用您想要的字段。如果你在合适的时间手动调用它们。
如何检查当前处理事件的锁定状态的示例,可以在这个link中看到:https://answers.unity.com/questions/1315276/event-system-setselectedgameobject-error-but-code.html
文档截图