Как сохранить данные с помощью переходов в приложении с несколькими раскадровками?

#ios #swift #segue #transfer

#iOS #swift #segue #передача

Вопрос:

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

Это первый просмотр:

 import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
        
    @IBAction func startedButtonPressed(_ sender: UIButton) {
    
    self.performSegue(withIdentifier: "goToPageTwo", sender: self)
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
        if segue.identifier == "goToPageTwo" {
            let destinationVC = segue.destination as! PageTwoViewController
  

и это второй просмотр страницы:

 import UIKit

class PageTwoViewController: UIViewController {
    
    var textBox: String?
    @IBOutlet weak var textFieldOne: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func backButtonPressed(_ sender: UIButton) {
        self.dismiss(animated: true, completion: nil)
    }
  

Ответ №1:

Что вы можете сделать, так это использовать закрытие обратного вызова для этого :

  1. определите переменную обратного вызова типа ((String) -> Void) в PageTwoViewController

  2. В prepare(для:, sender) назначьте закрытие переменной обратного вызова экземпляра pageViewController.

    класс ViewController: UIViewController { переопределить функцию viewDidLoad() { super.viewDidLoad() } var firstAnswer: Строка? // NEW_LINE_ADDED @IBAction функция startedButtonPressed(_ отправитель: UIButton) {

          self.performSegue(withIdentifier: "goToPageTwo", sender: self)
     }
     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
         if segue.identifier == "goToPageTwo" {
             let destinationVC = segue.destination as! PageTwoViewController
             destinationVC.textBox = firstAnswer //NEW_LINE_ADDED
             destinationVC.callBack = { answer in //NEW_LINE_ADDED
                 self.firstAnswer = answer //NEW_LINE_ADDED
             }
         }
     }
      

    }

В PageTwoViewController сделайте это

 class PageTwoViewController: UIViewController {
var textBox: String?
var callBack: ((String)-> Void) //NEW_LINE_ADDED
@IBOutlet weak var textFieldOne: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    textfieldOne.text = textBox ?? ""   //NEW_LINE_ADDED
}

@IBAction func backButtonPressed(_ sender: UIButton) {
    callBack?(textfieldOne.text ?? "") //NEW_LINE_ADDED
    self.dismiss(animated: true, completion: nil)
}
  

Ответ №2:

Если у вас несколько страниц с вопросником, один из способов справиться с этим — использовать структуру данных для сохранения всех ответов после того, как пользователь их ввел, а затем загрузить их в текстовое поле на странице, если они доступны.

Вы могли бы использовать hashmap, где ключ — это номер вопроса, а значение — текстовый ответ.

Затем вы можете передавать эту карту вперед / назад с помощью segue / unwind segue.

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