2017-01-21 7 views
1

У меня есть массив InputFields, в моей ситуации - шесть 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 каждого поля ввода в свободной ячейке Script Component.

+1

В чем проблема? У вас уже есть поля внутри массива InputFields. Если нажать submitName, вам необходимо выполнить цикл и собрать содержимое из каждого окна.Было бы неплохо создать объект, содержащий атрибут для каждого текстового поля, к которому вы собираетесь обращаться. –

+0

@AlexCio Проблема в том, что я хочу, когда я изменил значение в полях ввода, а затем переключился на другую сцену или выключил в приложении, те значения, которые я ввел, они отображаются в этих полях для ввода следующего редактирования. Как я могу это реализовать? –

+0

Надеюсь, я правильно понял, что вы хотели сказать. Попробуйте методы в моем посте, и это должно сработать! –

ответ

0

Ну, вы используете единственную переменную для всех переменных prefs игрока, n. Поэтому, когда вы меняете поле (с помощью SubmitName), оно использует переменную pref n и меняет ее. Это будет соответствовать последнему значению, которое вы дали 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); 
    } 
} 

Edit:
Добавлены строки для сохранения/загрузки из префов в коде ниже. Для моей тестовой установки у меня всего две сцены. Оба имеют два поля ввода и кнопку, которая вызывает это изменение сцены. Я могу набирать материал на полях, как мне нравится, менять сцены, и он остается. Также после перезапуска 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, строка Вэл) \t { \t \t //Debug.Log("Saved "+ вал +" к" + prefValue); \t \t PlayerPrefs.SetString (prefValue, val); \t} ' –

+0

Как я понимаю, PlayerPrefs принимает два аргумента - ключ и значение, так как я понимаю ваш код, тогда prefValue является ключом и значением val. –

+0

Да, 'prefValue' означает ключ. Как ваш код не работает? Разве он не сохраняет строку в prefs игрока? –

0

Если вы хотите сохранить данные, после того, как приложение остановлено или если она будет приостановлена, вам нужно добавить еще несколько функций для вашей MonoBehavior, так что он может обрабатывать дополнительные действия на конце системы или паузы.

Посмотрите на следующие функции in the documentation

OnApplicationQuit() 

OnApplicationPause() 

Эти функции будут вызываться автоматически. Внутри этих функций вам нужно перебирать текстовые поля и сохранять их. Это одна из последних функций, которые будут вызываться до того, как программа потеряет свои ресурсы.

Что касается изменения сцены, вам понадобится новая сцена, чтобы сообщить старому о любых дальнейших действиях. Как вы можете read in this post, есть только способ узнать, была ли загружена новая сцена. Возможно, у вас есть место, где вы можете сохранить последний активный объект сцены, а затем вызвать функцию последних сцен, чтобы выполнить процесс сохранения, пока объект не очищается.

+0

Это не поможет при переводе сцены и т. Д., И не нужно, если он использует предварительные команды игрока в прослушивателе событий, так как это мгновенно меняет (и сохраняет). –

+0

Я обновил свой ответ, но я думаю, вам нужно создать пользовательский подход, чтобы достичь того, чего вы хотите. –