监听Text changed事件时Listener未触发且文本无变更是什么原因?
问题根因与修复方案
核心问题:字符串替换逻辑错误,多次修改互相覆盖
你当前的代码存在逻辑错误,三次Replace操作全部基于原始的回调参数newText执行,每一次给customTextField.text赋值都会直接覆盖上一次的修改结果,最终仅最后一次替换"2"的操作会生效,其余替换逻辑全部丢失,因此会出现文本没有按预期修改、看起来回调没有触发的现象。
举个实际执行示例,假设输入的newText为012:
第一步替换0得到
₀12写入text
第二步基于原始newText替换1得到0₁2,直接覆盖上一步的₀12
第三步基于原始newText替换2得到01₂,再次覆盖上一步的0₁2
最终输出结果只有数字2被替换,完全不符合预期。
修复方案
修改替换逻辑为链式调用,所有替换操作基于上一次的修改结果执行,最后一次性给text属性赋值即可,你原先的监听移除/添加逻辑本身是正确的,无需调整。
修复后代码如下:
public TMP_InputField customTextField; public void Start () { customTextField.onValueChanged.AddListener(TextChangedEvent); } public void TextChangedEvent (string newText) { customTextField.onValueChanged.RemoveListener(TextChangedEvent); // 链式替换,所有修改依次生效 string processedText = newText.Replace("0", "₀") .Replace("1", "₁") .Replace("2", "₂"); customTextField.text = processedText; customTextField.onValueChanged.AddListener(TextChangedEvent); }
额外排查项
如果调整后回调仍未触发,请检查两个配置项:
- 确认Inspector面板中已经给
customTextField变量赋值了对应的TMP_InputField组件,不存在空引用 - 确认当前脚本已经挂载到场景中处于激活状态的GameObject上,脚本本身处于启用状态
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

