Home > front end >  Check for text change event in Unity
Check for text change event in Unity

Time:09-17

I am using TextMeshPro with an input field. I am searching for a input character and replace it with another character. I can do it easily with Update() function but the calls are quite expensive. How do I create an event to check if a text field has been changed?

EDIT: Based on the user's answer, I did try to use onValueChanged, but I received an exception error - StackOverflowException: The requested operation caused a stack overflow.

using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;

public class TextChangeEvent : MonoBehaviour {
   
   public TMP_InputField textInput_;   
   
   public void Start(){
     textInput_.onValueChanged.AddListener (delegate { myTextChanged(); });
   }

   public void myTextChanged(){
     textInput_.text = textInput_.text.Replace("World", "Unity");
  }
}

CodePudding user response:

Try this from Unity Documentation: OnValueChanged

Edit 1:
I researched a problem and i did read this post: Remove listener with one parameter in Unity
The problem is that you are changing the value when u detect a change, but this change you have done triggers in recurrency to infinity... So the solution is to remove the listener when you are changing value and then you need to add the listener again.

CodePudding user response:

Well what you are doing in

textInput_.text = textInput_.text.Replace("World", "Unity");

is changing the text
→ soooo again the event onValueChanged is called
→ again myTextChanged is called
→ it again changes the text
→ soooo again the event onValueChanged is called
→ .......... ENDLESS LOOP

What you can try to do is

public TMP_InputField textInput_;   
   
public void Start()
{
    // onValueChanged expects a `void(string)` so instead of adding an anonymous 
    // delegate you can never remove again rather make sure your method implements 
    // the correct signature and add it directly
    textInput_.onValueChanged.AddListener(myTextChanged);
}

// We need this signature in order to directly add and remove this method as 
// a listener for the onValueChanged event
public void myTextChanged(string newText)
{
    // temporarily remove your callback
    textInput_.onValueChanged.RemoveListener(myTextChanged);

    // change the text without being notified about it
    textInput_.text = newText.Replace("World", "Unity");

    // again attach the callback
    textInput_.onValueChanged.AddListener(myTextChanged);
}
  • Related