2017-01-21 53 views
1

我有一个数组InputFields,在我的处境 - 6 InputFields。我如何获取文本并从每个InputField保存它?如何获取文本并将其保存在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拖动每个输入字段在无细胞在脚本组件输入字段的数组。

+1

什么也正是这个问题?您已经拥有数组InputFields中的字段。如果按submitName,则必须循环并从每个框中收集内容。那岂不是坏可以创建包含您要访问 –

+0

@AlexCio 问题每个文本框的属性的对象,我想,当我在输入字段中改变了值,然后切换到另一个场景,或关闭关闭应用程序,我输入的那些值,它们显示在这些字段中,以便输入到下一个编辑。我怎样才能实现这个? –

+0

我希望我能正确理解你想说的话。尝试在我的文章中的方法,它应该工作! –

回答

0

嘛,你使用的是单变量的所有不同的球员首选项变量,n。所以,当你改变一个字段(使用SubmitName)时,它会使用该变量并更改它。这将对应于您在循环中输入给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); 
    } 
} 

编辑:
在代码中添加的行为保存/载入从首选项下面。对于我的测试设置,我只有两个场景。两者都有两个输入栏和一个调用场景变化的按钮。我可以按照自己的喜好在字段上输入东西,改变场景并保留下来。同样在编辑器中重新启动playmode。

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

你的代码写得对,非常感谢!但是,这使我有机会引入一个我保存在输入字段中的控制台,并且我希望能够将该字段中的文本保存到他的下一个编辑中。我尝试使用“PlayerPrefs”来做到这一点。 下面我发布的代码,但是这个代码不适合某些原因。请帮助我) '公共无效SubmitText(字符串prefValue,串VAL) \t { \t \t //Debug.Log("Saved “+ VAL +” 到“+ prefValue); \t \t PlayerPrefs.SetString(prefValue,VAL); \t}' –

+0

据我了解,在PlayerPrefs有两个参数 - 键和值,我理解你的代码,然后prefValue是关键,和VAL - 值。 –

+0

是的,'prefValue'被认为是关键。你的代码如何不起作用?它不会将字符串保存到玩家首选项? –

0

如果你要保存的数据,应用程序停止或者如果它被暂停,你需要一些更多的功能添加到您的MonoBehavior,以便它可以处理系统结束或暂停附加动作后。

请看以下功能in the documentation

OnApplicationQuit() 

OnApplicationPause() 

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

关于场景的变化,你需要新的场景,告诉老一做任何进一步的行动。就像你可以read in this post一样,只有一种方法可以知道是否加载了新的场景。 也许你有一个地方可以保存上一个活动的场景对象,然后调用最后一个场景功能在对象未被清除的同时执行保存过程。

+0

这对场景翻译等无助,如果他在事件监听器中使用玩家首选项,则不需要,因为它立即更改(并保存)它。 –

+0

我更新了我的答案,但我认为你需要创建一个自定义为什么实现你想要什么。 –

相关问题