#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:
Что вы можете сделать, так это использовать закрытие обратного вызова для этого :
-
определите переменную обратного вызова типа ((String) -> Void) в PageTwoViewController
-
В 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.
Возможно, было бы проще просто использовать статический класс с хэш-картой, доступной из каждого контроллера представления.