Как отменить выбор поля ввода Textmesh Pro при вводе? - PullRequest
2 голосов
/ 15 мая 2019

У меня есть поле ввода с некоторыми важными обработчиками выбора и отмены выбора. Есть его настройки:

enter image description here

Больше ничего не изменилось; Я не включаю эти обработчики, потому что проблема воспроизводима без них.


1011 * Expectation * Когда я нажимаю Enter, поле ввода подтверждает ввод, отменяет выбор и вызывает событие. То же относится и к клавише Esc, за исключением того, что ввод должен быть отменен. Reality

Когда я нажимаю Enter, поле ввода, кажется, остается выделенным, обработчик событий не вызывается, хотя я не могу набрать текст, и, если я нажимаю Enter снова, поле ввода, кажется, снова активируется (оно выбирает весь текст и У меня В фокусе - Выбрать все включено). Та же проблема с клавишей Esc.


Я понял, что On End Edit Событие вызывается при нажатии Enter, но как отменить выбор поля ввода? Он должен вызвать On Deselect event и не должен снова активироваться при Enter. Я пытался позвонить DeactivateInputField, это не сработало.

1 Ответ

1 голос
/ 15 мая 2019

Новый ответ, решение проблемы, см. Комментарии для уточнения:

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);

Другой пост, где обсуждается часть блокировки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


Снимок экрана из документации

Image from documentation

...