如何在多故事板应用程序中使用 segues 保存数据?
How to save data with segues in multi storyboard app?
我对编码非常陌生,我正在尝试制作一个简单的应用程序。该应用程序是一种问卷,它会问你一个问题,你必须将答案放在文本字段中。问题是当您尝试返回上一页时,您在 textField 中输入的文本消失了。如果您决定更改某个问题的答案,我希望文本保留在那里。
这是第一个视图:
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)
}
如果问卷有多个页面,一种处理方法是使用数据结构在用户键入答案后保存所有答案,然后将它们加载到页面上的文本框(如果可用)。
您可以使用哈希图,其中键是问题编号,值是文本答案。
然后您可以使用 segue/unwind segue 沿 forward/backward 传递该地图。
将静态 class 与 Hashmap 一起使用可能更容易,以便从每个视图控制器访问。
你可以做的是,你可以为此使用 callBack 闭包:
在 PageTwoViewController[=32= 中定义 ((String) -> Void) 类型的回调变量]
在prepare(for:, sender)中给PageViewController[=32=的callBack变量赋一个闭包]实例。
class ViewController: UIViewController {
重写 func viewDidLoad() {
super.viewDidLoad()
}
var firstAnswer:字符串? // NEW_LINE_ADDED
@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
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)
}
我对编码非常陌生,我正在尝试制作一个简单的应用程序。该应用程序是一种问卷,它会问你一个问题,你必须将答案放在文本字段中。问题是当您尝试返回上一页时,您在 textField 中输入的文本消失了。如果您决定更改某个问题的答案,我希望文本保留在那里。
这是第一个视图:
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)
}
如果问卷有多个页面,一种处理方法是使用数据结构在用户键入答案后保存所有答案,然后将它们加载到页面上的文本框(如果可用)。
您可以使用哈希图,其中键是问题编号,值是文本答案。
然后您可以使用 segue/unwind segue 沿 forward/backward 传递该地图。
将静态 class 与 Hashmap 一起使用可能更容易,以便从每个视图控制器访问。
你可以做的是,你可以为此使用 callBack 闭包:
在 PageTwoViewController[=32= 中定义 ((String) -> Void) 类型的回调变量]
在prepare(for:, sender)中给PageViewController[=32=的callBack变量赋一个闭包]实例。
class ViewController: UIViewController { 重写 func viewDidLoad() { super.viewDidLoad() } var firstAnswer:字符串? // NEW_LINE_ADDED @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 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)
}