【问题标题】:How can I get the text and save it in InputField?如何获取文本并将其保存在 InputField 中?
【发布时间】:2017-01-21 14:05:41
【问题描述】:

在我的情况下,我有一个数组 InputFields - 六个 InputFields。如何从每个 InputField 中获取文本并将其保存?

一切都应该这样工作:我打开应用程序,更改一个、两个或所有输入字段,然后关闭应用程序。再次,我打开,输入字段必须是我之前写的值。

我有一个看起来必须正常工作的代码,但是这个代码的工作原理是这样的:它只接受用户输入的最后一个值并将其写入最后一个输入字段。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SaveText : MonoBehaviour {
    public GameObject[] InputFields;
    public static string n;

    public void Start ()
{
    for(int i = 0; i < InputFields.Length; i++)
    {
        InputFields[i].GetComponent<InputField> ().text = PlayerPrefs.GetString (InputFields[i].name);
        Debug.Log (PlayerPrefs.GetString (InputFields[i].name));
        n = InputFields[i].name;
        var input = InputFields[i].GetComponent<InputField> ();
        var se = new InputField.SubmitEvent ();
        se.AddListener (SubmitName);
        input.onEndEdit = se;
    }

}

public void SubmitName(string arg)
{
    PlayerPrefs.SetString (n, arg);
}

我初始化的输入字段数组在 Unity 中拖动脚本组件中空闲单元格中的每个输入字段。

【问题讨论】:

  • 到底是什么问题?您已经拥有数组 InputFields 中的字段。如果按 submitName,您必须循环并从每个框中收集内容。为您要访问的每个文本字段创建一个包含属性的对象也不错
  • @AlexCio 问题是我想当我更改输入字段中的值,然后切换到另一个场景,或者关闭应用程序时,我输入的那些值,它们会显示出来在这些字段中输入到下一次编辑。我该如何实施?
  • 我希望我能正确理解你想说的话。尝试我帖子中的方法,它应该可以工作!

标签: c# unity3d input input-field unity3d-gui


【解决方案1】:

好吧,您正在为所有不同的播放器首选项变量使用一个变量,n。因此,当您更改字段(使用 SubmitName)时,它会使用该 n pref 变量并对其进行更改。这将对应于您在循环中给n 的最后一个值。

一种选择是将它也是一个数组 (private string prefValues[]) 或将调用输入字段传递给 SubmitName(或者更确切地说是它的名称)并使用它而不是 n。

一个小例子(从您的代码中,您实际上可以将您的 GameObject[] 更改为 InputField[],这样可以节省一些 GetComponent 调用):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class EventTest : MonoBehaviour
{
    public InputField[] inputFields;

    void Start ()
    {
        foreach(InputField field in inputFields)
        {
            var se = new InputField.SubmitEvent();
            se.AddListener(delegate {
                SubmitText(field.name, field.text);
            });
            field.onEndEdit = se;
        }
    }

    public void SubmitText(string prefKey, string prefVal)
    {
        Debug.Log("Saved " + prefVal + " to " + prefKey);
    }
}

编辑:
在下面的代码中添加了从首选项保存/加载的行。对于我的测试设置,我只有两个场景。两者都有两个输入字段和一个调用该场景更改的按钮。我可以根据需要在字段上输入内容,更改场景并保持不变。在编辑器中重新启动播放模式时也是如此。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class EventTest : MonoBehaviour
{
    public InputField[] inputFields;

    void Start ()
    {
        foreach(InputField field in inputFields)
        {
            // Get field values from player prefs if existing
            // (it should only not exist the very first time or if you delete/clear the prefs)
            if(PlayerPrefs.HasKey(field.name))
                field.text = PlayerPrefs.GetString(field.name);

            var se = new InputField.SubmitEvent();
            se.AddListener(delegate {
                SubmitText(field.name, field.text);
            });
            field.onEndEdit = se;
        }
    }

    public void SubmitText(string prefKey, string prefValue)
    {
        // store the typed text of the respective input field
        PlayerPrefs.SetString(prefKey, prefValue);
    }

    public void ChangeScene()
    {
        if(SceneManager.GetActiveScene().name == "Scene1")
        {
            SceneManager.LoadScene("Scene2");
        }
        else
        {
            SceneManager.LoadScene("Scene1");
        }
    }
}

【讨论】:

  • 你的代码写对了,非常感谢!但这让我有机会引入我保留在输入字段中的控制台,并且我希望能够保存该字段中的文本,直到他下一次编辑。我尝试使用“PlayerPrefs”来做到这一点。下面我发布了代码,但由于某种原因,此代码不起作用。请帮帮我)public void SubmitText(string prefValue, string val) { //Debug.Log("Saved " + val + " to " + prefValue); PlayerPrefs.SetString (prefValue, val); }
  • 据我了解,PlayerPrefs 有两个参数 - 键和值,据我了解您的代码,然后 prefValue 是键,而 val - 值。
  • 是的,prefValue 是关键。您的代码如何不起作用?它不会将字符串保存到播放器首选项吗?
  • 是的,不幸的是代码不能正常工作。它不会将字符串保存到 PlayerPrefs。我不知道为什么......我会告诉你,到目前为止,程序可以运行:我运行应用程序,输入字段为空,我在输入字段中写入任何值,例如,在第一个字段中 - 单词一个,第二个字段中的单词二,等等。我按回车键。输入所有值后,我移动到另一个场景或关闭应用程序,然后再次运行。但是在输入字段为空:( 在您的代码中,我刚刚添加了以下行: PlayerPrefs.SetString (prefKey, prefVal);
  • 您也添加了GetString 部分吗?我在Start 中的代码只对委托进行监听。
【解决方案2】:

如果您想保存数据,在应用程序停止或暂停后,您需要向您的MonoBehavior 添加更多功能,以便它可以处理系统结束或暂停时的其他操作。

看看下面的函数in the documentation

OnApplicationQuit()

OnApplicationPause()

这些函数将被自动调用。在这些函数中,您需要遍历文本字段并保存它们。它是在程序失去其资源之前将被调用的最后一个函数。

关于场景更改,您需要新场景告诉旧场景执行任何进一步的操作。就像你可以read in this post 一样,只有一种方法可以知道是否加载了新场景。 也许您有一个地方可以保存最后一个活动场景对象,然后在对象未清除时调用最后一个场景函数来执行保存过程。

【讨论】:

  • 这对场景翻译等没有帮助,如果他在事件监听器中使用播放器首选项则不需要,因为这会立即更改(并保存)它。
  • 我更新了我的答案,但我认为你需要创建一个自定义的为什么来实现你想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多