Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取文本并将其保存在InputField中?_C#_Unity3d_Input_Input Field_Unity3d Gui - Fatal编程技术网

C# 如何获取文本并将其保存在InputField中?

C# 如何获取文本并将其保存在InputField中?,c#,unity3d,input,input-field,unity3d-gui,C#,Unity3d,Input,Input Field,Unity3d Gui,我有一个数组InputFields,在我的情况下-六个InputFields。如何从每个输入字段获取文本并保存 一切都应该是这样:我打开应用程序,更改一个、两个或所有输入字段,然后关闭应用程序。再次打开,输入字段必须是我前面写的值 我有一个代码,它似乎工作正常,但这个代码的工作原理是这样的:它只接受用户输入的最后一个值,并将其写入最后一个输入字段 using System.Collections; using System.Collections.Generic; using UnityEngi

我有一个数组InputFields,在我的情况下-六个InputFields。如何从每个输入字段获取文本并保存

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

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

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);
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.UI;
公共类SaveText:monoBehavior{
公共游戏对象[]输入字段;
公共静态字符串n;
公共无效开始()
{
for(int i=0;i

我初始化的一组输入字段,在脚本组件的自由单元格中统一拖动每个输入字段。

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

一个选项是让它也成为一个数组(
私有字符串prefValues[]
),或者将调用输入字段传递给
SubmitName
(或者更确切地说是它的名称),并使用它代替
n

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

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

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

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

一个选项是让它也成为一个数组(
私有字符串prefValues[]
),或者将调用输入字段传递给
SubmitName
(或者更确切地说是它的名称),并使用它代替
n

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

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

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

如果要在应用程序停止或暂停后保存数据,则需要向
monobhavior
添加更多函数,以便它可以处理系统端或暂停时的其他操作

查看以下功能

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

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

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

查看以下功能

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

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

到底是什么问题?数组输入字段中已经有字段。如果按submitName,您必须循环并从每个框中收集内容。W为要创建的每个文本字段创建一个包含属性的对象也不错access@AlexCio问题是,当我更改了输入字段中的值,然后切换到另一个场景,或关闭应用程序时,我希望在这些字段中显示我输入的值,以便输入到下一个ed它。我如何实现这个?我希望我正确理解了你想说的。尝试一下我帖子中的方法,它应该会起作用!到底是什么问题?数组输入字段中已经有字段了。如果按submitName,你必须循环并从每个框中收集内容。Wo
OnApplicationQuit()

OnApplicationPause()