Unity中InputField输入文本保存后变回初始值问题如何解决?
Unity点击按钮存储输入框内容后数据被异常覆盖的解决方案
问题根源
你代码的核心问题是将AddListener注册监听的逻辑写在了Update生命周期函数中:
Update是每帧执行一次的函数,运行时间越长,给confirm按钮添加的点击监听就越多- 你点击一次按钮时,会按顺序触发所有已经添加的
readchartLabelInputOnClick回调:- 第一次回调执行:将当前输入框的真实内容存入
PlayerPrefs,再把输入框内容重置为Enter Text... - 后续N次回调执行:此时输入框内容已经是重置后的文本,会直接把
Enter Text...覆盖写入PlayerPrefs,最终表现就是你保存的数据被同步修改为重置后的内容
- 第一次回调执行:将当前输入框的真实内容存入
修复代码
将监听注册逻辑移到Awake或Start中,保证全局只注册一次即可,优化后的代码如下:
public InputField input; public Button confirm; private void Awake() { // 注册前先移除一遍,避免场景切换等情况导致重复注册,稳定性更高 confirm.onClick.RemoveListener(readchartLabelInputOnClick); confirm.onClick.AddListener(readchartLabelInputOnClick); } // 原Update里的DebugLog如果没有每帧打印的必要可以直接删掉,减少性能消耗 private void Update() { Debug.Log(PlayerPrefs.GetString("chartLabel")); } public void readchartLabelInputOnClick() { PlayerPrefs.SetString("chartLabel", input.text); // 主动调用Save落盘,避免游戏异常退出时本次存储内容丢失 PlayerPrefs.Save(); input.text = "Enter Text..."; }
内容的提问来源于stack exchange,提问作者HankL
相关产品推荐
相关产品推荐

